perché non riesco a sovrascrivere lo stack frame

3

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:

link

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é?

    
posta user1803784 24.02.2016 - 04:49
fonte

2 risposte

3

Il tuo screenshot mostra che gdb ha raggiunto il punto di interruzione, Temp1 e temp2 non sono ancora sovrascritti perché stai colpendo un breakpoint su strcpy che blocca l'esecuzione prima strcpy sovrascrive lo stack. Come per l'immagine del tuo libro, puoi vedere che la loro linea 7 è printf che accade dopo che strcpy corrompe lo stack. Prova a usare il comando c gdb per continuare. Il controllo EIP si verifica nell'epilogo, quando la funzione ritorna.

    
risposta data 24.02.2016 - 11:15
fonte
3

Una nota a margine non direttamente correlata al problema:

Non sono sicuro che il libro che stai usando sia il migliore per iniziare il tuo sviluppo di pentesting \ exploit con. Consiglierei il manuale di OSCP o il weidman della Georgia "Test di penetrazione Introduzione pratica all'hacking"
Oppure puoi provare i SEED laboratori del progetto.

Ora non sono sicuro di poter dire cosa sta andando storto senza provare il laboratorio (che proverò a fare e tornare da te). Tuttavia, posso dirti che aumentare la dimensione del buffer non è sempre la risposta. In effetti, a volte corrompe il tuo exploit perché il tuo buffer extra lungo potrebbe sovrascrivere i dati della funzione del chiamante causando all'app di chiamare il gestore delle eccezioni che, se è successo, moverà l'indirizzo della funzione di gestore delle eccezioni all'EIP e ti costringerà a fai le cose in un modo diverso per sovrascrivere l'EIP perché ora l'indirizzo del gestore delle eccezioni è in EIP, non il tuo buffer.

    
risposta data 24.02.2016 - 05:37
fonte

Leggi altre domande sui tag