2010-08-14 4 views
8

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?

+6

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

+0

Inoltre, benvenuto in SO e +1 per la dicitura eloquente. – Potatoswatter

+3

Mi chiedo perché Potatoswatter non ha pubblicato il suo commento come risposta ... –

risposta

1

I compilatori sono liberi di riorganizzare le variabili nel modo migliore. Credo che l'unica restrizione nell'ordine dei membri della struttura. Questi devono essere in memoria nello stesso ordine dichiarato nella struttura.

5

Il compilatore è autorizzato a scegliere qualunque ordine desideri, al fine di fornire un codice più ottimale, o anche solo casuale perché è più facile da implementare. Una cosa che potresti provare è il flag -O0 che disabilita tutte le ottimizzazioni.

0

Apple ha una funzione di sicurezza per prevenire proprio il tipo di voi l'hacking stiamo parlando di: - C'è un grado di randomizzazione in cui tutto è memorizzato nella memoria, quindi non è possibile, ad esempio, trovare la memoria allocata per un determinato programma, e andare al 1502 te dove si trova la funzione per aprire i blocchi del vault ad alta sicurezza, perché non si trova sempre nello stesso posto in memoria.

Vedere http://en.wikipedia.org/wiki/Address_space_layout_randomization per dettagli su come funziona.

Divertente coincidenza che ci si sarebbe imbattuti in questo, e che Matt Joiner sarebbe incappato nella risposta mentre cercava di bruciare mela.

+0

Ripensandoci ... hai detto che Ubuntu è il sistema operativo attivo? Potrei sbagliare completamente se questo è il caso. –

+3

In primo luogo, l'OP ha affermato di eseguire l'esperimento su una macchina virtuale Ubuntu. In secondo luogo, Ubuntu ha anche ASLR abilitato. In terzo luogo, ASLR randomizza la base dello stack, ma non randomizza le posizioni relative di due variabili stack. – caf