Attualmente sto leggendo il Manuale di Hacking The Ethical Hacker's di Gray Hat, quarta edizione e ho una domanda con un esercizio nel libro. Il laboratorio "Lab 10 - 1 Overflow of meet.c" è un laboratorio in cui eseguiamo un buffer overflow nel programma. Il programma è il seguente:
//meet.c
#include <stdio.h> // needed for screen printing
#include <string.h>
greeting(char *temp1,char *temp2){ // greeting function to say hello
char name[400]; // string variable to hold the name
strcpy(name, temp2); // copy the function argument to name
printf("Hello %s %s\n", temp1, name); // print out the greeting
}
main(int argc, char * argv[]){ // note the format for arguments
greeting(argv[1], argv[2]); // call function pass title & name
printf("Bye %s %s\n", argv[1], argv[2]); // say "bye"
} // exit program
Il libro ti informa di compilare il codice con:
gcc -ggdb -mpreferred-stack-boundary=2 -fno-stack-protector -z execstack -o meet meet.c
Non sono troppo sicuro di cosa passa ogni argomento al compilatore significa che ho letto dalla pagina man che mpreferred-stack-boundary tenta di allineare il limite dello stack in questo caso 2 ^ 2 = 4 byte. Ho visto il flag di non stack protector usato prima quindi so che permette di distruggere lo stack e il -z execstack che voglio credere è rendere i dati eseguibili dallo stack (rimuovendo il bit NX).
E prima di tutto questo abbiamo già disabilitato ASLR usando il comando:
echo "0" > /proc/sys/kernel/randomize_va_space
Il libro menziona anche di disabilitare quanto segue:
echo "0" > /proc/sys/kernel/exec-shield
echo "0" > /proc/sys/kernel/exec-shield-randomize
Non ho trovato questi file nella directory specificata quindi non ho eseguito il comando Ero curioso di sapere se questo causava il mio problema, quindi ho cercato su Google e ho trovato questo post sul forum:
Ma il post sul forum affermava che gli argomenti che abbiamo passato al compilatore si occupano già di disabilitare la funzione "exec-shield" e la funzione "exec-shield-randomize".
Quindi il problema che sto avendo è quando seguo le istruzioni del libro ricevo risultati diversi dal libro.
Il libro diceva che lo stack frame sarebbe simile a questo:
Function
Variable Parameters
______________________________________________________________________________
| | ESP | Name | EBP | EIP | Temp1 | Temp2 |
-------------------------------------------------------------------------------
Low Mem: <--------- Stack Grow High Mem:
0x11111111 0xfffffff0
Hanno quindi caricato il programma in gnu debugger con il seguente comando:
gdb -q meet
Hanno quindi posizionato un punto di interruzione sulla linea 7:
strcpy(name, temp2);
È passato il valore dell'argomento di overflow usando perl:
(gdb) esegui Mr perl -e 'print "A" x 600'
Per questo il risultato è il seguente:
Breakpoint 1, greeting (temp1=0x41414141 <Address 0x41414141 out of bounds>,
temp2=0x41414141 <Address 0x41414141 out of bounds>) at meet.c:7
printf("Hello %s %s\n",temp1, name); //print out the greeting
Così hanno scritto con successo sul registro EIP, puntatori temp1 e temp2 come diceva il libro ma quando l'ho provato ho ottenuto questo:
Hoprovato600,1.000,10.000ecomepuoivederenelloscreenshot100.000A's.Quindiqualcunopuòdirmisestofacendoqualcosadisbagliatostodimenticandodidisabilitareunafunzionedisicurezzaoqualcosadelgenere?
Informazionisulsistemaoperativo:
Ubunut14.04Linuxubuntu3.19.0-49-generic#55~14.04.1-UbuntuSMPFriJan2211:23:34UTC2016i686i686i686GNU/Linux
UPDATE:
Questoèilrisultatodellibro:
Il libro dichiara che ora i puntatori temp1 e temp2 vengono sovrascritti e ora punta a null per me questo non è accaduto. Perché?