Innanzitutto, prima di poter affrontare il problema, devi verificare se l'eseguibile è in esecuzione in ASLR ( link )
In tal caso, dovrai trovare un modo per divulgare l'indirizzo dal programma, poiché l'indirizzo di libc sarà diverso ogni volta. Puoi facilmente controllarlo eseguendo mappature gdb - > b main - > info proc un paio di volte e confrontando gli offset. Se sono diversi, il tuo eseguibile probabilmente sta girando sotto ASLR.
Supponendo che non vi sia alcuna protezione ASLR, l'utilizzo delle mappature proc di gdb - > b main - > info dovrebbe fornire l'indirizzo di base di libc SO. Per trovare l'offset della funzione a cui vuoi saltare, puoi usare molti metodi, ma l'uso di readelf -s dovrebbe funzionare bene - questo ti darà l'offset della funzione calcolata dalla base della SO (base indirizzo di SO + offset = posizione del codice in fase di esecuzione).
Per trovare l'indirizzo di base del modulo eseguibile in fase di esecuzione è possibile utilizzare gdb o qualsiasi altro debugger e cercare il punto di ingresso dell'eseguibile (o cercare la stringa dopo che l'eseguibile è stato caricato nella memoria. .). Fondamentalmente qualsiasi programma che caricherà il tuo eseguibile in memoria e ti permetterà di visualizzare la memoria lo farà.
L'indirizzo di un eseguibile sotto linux è solitamente 0x400000 per eseguibili a 64 bit e 0x08048000 per eseguibili a 32 bit come definito dal linker di gnu. Ma non c'è nulla che impedisca a qualcuno di modificare il punto di ingresso in un indirizzo diverso.
Dopo aver individuato i mapping della memoria, devi trovare i gadget nel codice, lascerò che tu faccia delle ricerche ... link
Forse puoi trovare più risposte osservando esercizi su exploit-exercises.com
per esempio, protostar stack6 dovrebbe occuparsi di ret2libc, puoi cercare una soluzione
modificato: sembra che ldd non ti dia sempre l'indirizzo corretto, ignora anche la disabilitazione dell'ASLR sul mio sistema - Probabilmente è meglio usare gdb