Sto leggendo Hacking: The Art of Exploitation (2a edizione), e attualmente sono nella sezione relativa ai buffer overflow.Perché la variabile int non viene prima dell'array di caratteri in termini di indirizzamento, non importa come la codifico in C?
Nel primo esempio, le variabili sono dichiarate/inizializzato in questo ordine:
int auth_flag = 0;
char password_buffer[16];
L'esempio continua a spiegare che è possibile utilizzare gdb per esaminare auth_flag
e s' password_buffer
indirizzi, e sarete si noti che l'indirizzo di auth_flag
è superiore a quello di password_buffer
. Cose da tenere a mente: sto eseguendo tutto questo in Ubuntu all'interno di Virtualbox su un MacBook Pro (processore Intel, 64 bit).
ho compilato il codice del primo esempio come questo: gcc -g -fno-stack-protector -o auth_overflow auth_overflow.c
Come previsto, auth_flag
'indirizzo di s è superiore password_buffer
' s.
Per risolvere il problema presentato sopra, l'autore spiega che si dovrebbe passare l'ordine delle dichiarazioni:
char password_buffer[16];
int auth_flag = 0;
ho compilato il codice allo stesso modo: gcc -g -fno-stack-protector -o auth_overflow2 auth_overflow2.c
Purtroppo, non ho visto auth_flag
L 'indirizzo è inferiore a password_buffer
. In effetti, era ancora più alto. Perchè è questo? Che cosa sto facendo di sbagliato?
Il compilatore tenderà ad organizzare le variabili in ordine di riduzione dei requisiti di allineamento per ridurre al minimo il riempimento. Detto questo, è strano che "int" sia sempre più alto e non sempre inferiore.Ad ogni modo, non puoi dipendere dall'ordine della dichiarazione fare qualsiasi tipo di differenza, quindi è un punto strano per il libro. Complimenti per aver eseguito l'esperimento e trovato la BS. – Potatoswatter
Inoltre, benvenuto in SO e +1 per la dicitura eloquente. – Potatoswatter
Mi chiedo perché Potatoswatter non ha pubblicato il suo commento come risposta ... –