2012-04-06 5 views
7

Qualcuno di voi ha dovuto affrontare il seguente problema quando si tenta di sovrascrivere il puntatore $esp?Smashing Stack su Ubuntu 11.10

Certo, provare una dimensione del buffer legit funziona sempre! Ma, quando si tenta di aumentare la dimensione del buffer per sovrascrivere il $esp e si riesce a toccare con successo il primo byte, secondo byte o terzo byte di $esp funziona perfettamente. Ma, non appena si tenta di sovrascrivere tutti i 4 byte dello $esp, cambia completamente il suo contenuto e l'indirizzo. Non mostra più 41 s come ho usato "A" per riempire il buffer. Ho allegato uno screenshot che forse spiegherà in maggior dettaglio. Ringrazia tutti.

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

smash attempt

risposta

5

questo è legato alla realizzazione di NX emulation nei kernel non-PAE Ubuntu 32-bit, e quando l'eccezione CPU viene sollevata. Per le regioni di memoria sotto la linea di emulazione NX (cioè "all'interno" dell'area NX emulata: dall'indirizzo 0 alla fine del segmento di testo del programma - inferiore all'indirizzo 0x08049000 di questo binario in /proc/$pid/maps), il segfault viene consegnato dopo EIP è atterrato sull'effettivo indirizzo non valido. Per gli indirizzi sopra la linea, l'errore viene attivato attraverso un percorso diverso che segnala l'errore senza spostare EIP in avanti verso l'indirizzo di errore, rimanendo invece sull'istruzione "ret" che porta all'errore.

Si può vedere questo in gdb:

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

è anche possibile vedere la differenza nel modo in cui i difetti sono riportati in dmesg uscita. Questa è l'uscita associata al "508" tentativo:

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

E questo è per "507":

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

Se il boot con il kernel PAE installato, sudo apt-get install linux-image-$(uname -r)-pae, e si dispone di un PAE CPU capace, vedrai il comportamento che ti aspetteresti (dato che l'emulazione NX sarà disabilitata a favore dell'hardware NX), e tutti e 4 i tentativi saranno segfault con gli EIP previsti.