tutorial seguridad overflows ejemplo c security buffer-overflow

seguridad - gets c buffer overflow



Si su pila y montón no son ejecutables, ¿cómo puede ejecutarse su código? (7)

Ese tipo de protección es proporcionada por el sistema operativo y no se puede realizar en la capa de aplicación.

Vea el artículo de wikipedia, que también explica cómo habilitarlo en Windows: http://en.wikipedia.org/wiki/Data_Execution_Prevention

Leí un libro sobre el desbordamiento de búfer, y sugiero el siguiente para tratar:

Hacer que la pila (y el montón) no sea ejecutable proporciona un alto grado de protección contra muchos tipos de ataques de desbordamiento de búfer para programas existentes.

Pero no entiendo cómo podemos hacerlo, ¿dónde se llevaría a cabo la ejecución, si no fuera en el montón o en la pila?


Hay lo que se conoce como tipo de explotaciones de "programación orientada al retorno" (AKA ROP).

El atacante encuentra la forma de hacer que su código malvado salga de diferentes partes del programa que está siendo explotado.

Encuentra secuencias de bytes útiles (instrucciones) antes de los bytes de instrucciones de retorno que pueden realizar operaciones útiles en registros o en la memoria, como mover un valor a una ubicación, agregar valores, comparar valores, etc. Son micro subrutinas que obtiene el exploit. construido de.

Luego, al explotar un error de código, el atacante obliga al programa a comenzar a ejecutar la cadena de esas subrutinas que hacen todo el trabajo malvado.

Entonces, ahora el código bueno se convierte en código malvado. Nada se ejecuta en la pila o en el montón.

También es digno de mención que en las CPU donde las instrucciones abarcan varios bytes y tienen una longitud variable, incluso los operandos de instrucciones inmediatas (IOW, constantes numéricas) que forman parte de las instrucciones pueden convertirse en código, por lo que las posibilidades de encontrar secuencias de bytes utilizables son mayores allí. en las CPU "más simples".

A menudo, también es posible construir código malicioso que cambiará la protección de la memoria y la vulnerabilidad ya no estará limitada por el código de la aplicación existente.


Puede usar su desbordamiento para sobrescribir la dirección de retorno de una función, que puede saltar a alguna dirección conocida con su código. Pero luego los escritores de sistemas operativos respondieron aleatorizando el código de dirección que se ejecuta en ...


Si entiendo su pregunta correctamente, ninguna de las otras respuestas lo abordará. La respuesta es que la ejecución se produce en la sección de código, que no es ni pila ni pila. En un sistema de memoria paginado típico, el código de un archivo de programa (por ejemplo, un archivo .exe en Windows) se carga en páginas ejecutables pero de solo lectura. Se asignan páginas de escritura adicionales (y ejecutables) al proceso para la pila y el montón. La sugerencia aquí es que el sistema operativo y el hardware deberían cooperar para marcar las páginas de escritura pero no ejecutables (la respuesta de rgngl explica cómo hacerlo en Windows).

Incluso con el montón y la pila no ejecutables, aún son posibles las vulnerabilidades que utilizan la programación orientada al retorno mencionada en la respuesta de Alexey Frunze, pero existen técnicas de protección que incluso las bloquean, como la protección de la pila y la aleatorización del diseño del espacio de direcciones. http://en.wikipedia.org/wiki/Return-to-libc_attack#Protection_from_return-to-libc_attacks


Su código se ejecuta en el segmento de texto, no en la pila o en el montón (ambos para almacenamiento de datos). Así que la organización es:

<highest addresses> stack ... heap data section (initialized data & bss - uninitialized data) code section (text) <lowest addresses>

La sección de código es ejecutable pero inmutable. Este artículo de wikipedia tiene más detalles: https://en.wikipedia.org/wiki/Data_segment


puedes saltar a cualquier otro lugar que sea un segmento ejecutable y ejecutar tu código malvado ...

Después de todo, todos los datos en cualquier almacenamiento, la memoria son bits y los bits pueden ser instrucciones para que la cpu se ejecute.


Ejemplo muy concreto: haga que la dirección de retorno apunte al system y la siguiente ranura en la pila (o el primer registro de argumentos en los arcos de paso por registro) sea un puntero a la cadena "/bin/sh" .