2012-04-06 9 views
7

¿Alguno de ustedes se enfrentó al siguiente problema al intentar sobreescribir el puntero $esp?Smashing Stack en Ubuntu 11.10

Por supuesto, intentar un tamaño legítimo de búfer siempre funciona! Pero, cuando intenta aumentar el tamaño del búfer para sobrescribir el $esp y logra el éxito para tocar el primer byte, segundo byte o tercer byte de $esp, funciona perfectamente. Pero, tan pronto como intenta sobrescribir los 4 bytes completos de $esp, cambia por completo el contenido del mismo, así como la dirección. No muestra 41 s más ya que utilicé "A" s para llenar el búfer. Adjunté una captura de pantalla que tal vez explique con más detalle. Gracias a todos.

#include <stdio.h> 
#include <string.h> 
int main(int argc, char** argv) 
{ 
    char buffer[500]; 
    strcpy(buffer, argv[1]); 
    return 0; 
} 

smash attempt

Respuesta

5

Esto se relaciona con la aplicación de NX emulation en los granos no PAE Ubuntu de 32 bits, y cuando se eleva la excepción CPU. Para regiones de memoria debajo de la línea de emulación NX (es decir, "dentro" del área NX emulada: desde la dirección 0 hasta el final del segmento de texto del programa - menor que la dirección final 0x08049000 de este binario en /proc/$pid/maps), el segfault se entrega después EIP ha aterrizado en la dirección inválida real. Para direcciones por encima de la línea, la falla se activa a través de una ruta diferente que informa la falla sin mover el EIP hacia adelante a la dirección de fallas, permaneciendo en cambio en la instrucción "ret" que conduce a la falla.

Esto se puede ver en GDB:

(gdb) x/1i $pc 
=> 0x8048454 <main+64>: ret  
(gdb) info reg esp 
esp   0xbffff54c  0xbffff54c 
(gdb) x/wx $esp 
0xbffff54c:  0x41414141 

También se puede ver la diferencia en cómo se informa de los fallos en dmesg salida. Esta es la salida asociada con el "508" intento:

[ 585.913896] a.out[1528] general protection ip:8048454 sp:bff1e8ec error:0 in a.out[8048000+1000] 

Y esto es para "507":

[ 598.999760] a.out[1531]: segfault at 414141 ip 00414141 sp bfcac2c0 error 4 in libc-2.13.so[5e7000+178000] 

Si arrancar con el kernel PAE instalado, sudo apt-get install linux-image-$(uname -r)-pae, y usted tiene un PAE CPU capaz, verá el comportamiento que esperaría (ya que la emulación NX se desactivará a favor del hardware NX), y los 4 intentos segmentarán la falla con los EIP esperados.

Cuestiones relacionadas