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.
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
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
@ Joe, hai risposto alla tua domanda? – mofoe