Mi comprensión (ciertamente incompleta) de un compromiso del sistema remoto en el nivel del código binario es aproximadamente:
- Una vulnerabilidad del programa, como la validación de entrada faltante, se explota para insertar shellcode externo en el sistema de destino.
- El flujo del programa se desvía para ejecutar el código de shell, por ejemplo. sobrescribiendo las direcciones de retorno en la pila de llamadas.
- El atacante ahora puede ejecutar código arbitrario en el sistema de destino con los privilegios del proceso comprometido.
Supongamos que existen mecanismos de protección a nivel del sistema, en particular:
- Todos los segmentos de datos no son ejecutables
- Todos los segmentos de código están marcados como de solo lectura
- El código se construye con indicadores de endurecimiento, como el protector de pila, el control del tamaño de entrada, etc.
¿Cómo es posible obtener el control del proceso de destino (a través de un ataque a nivel de código de máquina) en estas condiciones? ¿Cómo se puede ejecutar shellcode cuando los segmentos de código no pueden modificarse y los segmentos de datos no pueden ejecutarse?