torna a libc- trovare l'indirizzo di libc e trovare gli offset

1

Così ho provato ad eseguire un return-to-libc secondo link .

Ho trovato l'indirizzo di libc usando "ldd vuln" e ho trovato l'offset del sistema usando "readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system".

Ho avuto difficoltà a trovare l'indirizzo di "sh" nel comando fflush nel programma.

Ho provato hexdump del file binario e ho trovato l'offset di "sh \ x00", ma non ho trovato l'indirizzo di base del file binario.

Non sono sicuro che gli indirizzi che ho trovato su libc e offset del sistema siano validi e non so davvero come trovare l'indirizzo effettivo della stringa "sh \ x00".

Per favore correggimi se ho torto sul modo in cui ho trovato gli indirizzi, e mi piacerebbe ricevere aiuto per trovare l'indirizzo della stringa:)

Grazie in anticipo! : -)

    
posta Jonathan 24.08.2017 - 09:33
fonte

1 risposta

1

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

    
risposta data 27.08.2017 - 00:49
fonte