2015-09-02 13 views
5

Recentemente ho iniziato a utilizzare GDB per una lezione e ho sofferto un po '. Ho an assignment dove devo fare il laboratorio 1 esercizio 2 che ha bisogno di me per cercare di due vulnerabilità nel codice e procedere come segue con loro:get return address GDB

Il primo deve sovrascrivere un indirizzo di ritorno sullo stack, e il secondo deve sovrascrivere un'altra struttura di dati che verrà utilizzata per assumere il controllo del flusso del programma.

ho già overflow la struttura dei dati, che quello che penso che sta parlando è l'EIP, che indica quali altre istruzioni che farà.

Ora come si arriva all'indirizzo di ritorno (RET) del frame? Qualsiasi frame, non importa, voglio solo sapere come posso calcolare i byte tra il RET e forse l'ESP in modo da poterlo sottrarre e ottenere la lunghezza. Ho appena iniziato con GDB, quindi rilassati con me.

risposta

8

Ora come si arriva all'indirizzo di ritorno (RET) del frame?

Per ottenere la posizione dell'indirizzo di ritorno memorizzato di una funzione specifica, è possibile posizionare un punto di interruzione su tale funzione e utilizzare il comando info frame.

Ecco un esempio:

gdb /path/to/binary 
(gdb) br main 
(gdb) run 
Starting program: /path/to/binary 

Breakpoint 1, 0x08048480 in main() 
(gdb) info frame 
Stack level 0, frame at 0xffffd700: 
eip = 0x8048480 in main; saved eip = 0xf7e3ca63 
Arglist at 0xffffd6f8, args: 
Locals at 0xffffd6f8, Previous frame's sp is 0xffffd700 
Saved registers: 
ebp at 0xffffd6f8, eip at 0xffffd6fc 

Annotare il saved eip = 0xf7e3ca63 e eip at 0xffffd6fc. In questo caso si desidera sovrascrivere il valore su 0xffffd6fc in modo che quando la funzione restituisce l'esecuzione continuerà al valore memorizzato lì.

+0

Quindi voglio sovrascrivere il puntatore di istruzioni (EIP)? Questo mi porta ad un'altra domanda: non capisco la differenza tra EIP e RET. L'EIP non intende indicare quale istruzione verrà dopo e il RET è l'indirizzo salvato che il programma memorizza prima di entrare in una funzione? In che modo RET ed EIP sono in relazione tra loro? – Joe

+1

Sì, il 'RET' è il' EIP' memorizzato. L'istruzione 'call' memorizzerà l'indirizzo della prossima istruzione in pila. Nell'epilogo della funzione l'istruzione 'ret' farà' pop' il 'RET' dallo stack nel registro' EIP'. Quando hai sovrascritto il 'RET', questo è il momento in cui otterrai il controllo del flusso del programma. Puoi leggere ulteriori informazioni sulla funzione pro- ed epilogo qui: https://en.wikipedia.org/wiki/Function_prologue – mofoe

+0

@ Joe, hai risposto alla tua domanda? – mofoe

Problemi correlati