Ret2plt
Last updated
Last updated
Impara e pratica l'Hacking su AWS: HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)
L'obiettivo di questa tecnica sarebbe quello di ottenere un indirizzo da una funzione dal PLT per poter aggirare l'ASLR. Questo perché se, ad esempio, si ottiene l'indirizzo della funzione puts
dalla libc, è possibile calcolare dove si trova la base di libc
e calcolare offset per accedere ad altre funzioni come system
.
Questo può essere fatto con un payload di pwntools
come (da qui):
Nota come puts
(utilizzando l'indirizzo dal PLT) viene chiamato con l'indirizzo di puts
situato nella GOT (Tabella degli Offset Globali). Questo perché al momento in cui puts
stampa l'entry GOT di puts, questa entry conterrà l'indirizzo esatto di puts
in memoria.
Nota anche come l'indirizzo di main
viene utilizzato nello sfruttamento in modo che quando puts
termina la sua esecuzione, il binario richiama nuovamente main
anziché uscire (così l'indirizzo leaked continuerà ad essere valido).
Nota come affinché ciò funzioni il binario non può essere compilato con PIE oppure devi avere trovato un leak per aggirare PIE al fine di conoscere l'indirizzo del PLT, GOT e main. Altrimenti, devi aggirare prima PIE.
Puoi trovare un esempio completo di questo bypass qui. Questo è stato lo sfruttamento finale di quell'esempio:
A 64 bit, ASLR abilitato ma senza PIE, il primo passo è riempire un overflow fino al byte 0x00 del canary per poi chiamare puts e fare leak. Con il canary viene creato un ROP gadget per chiamare puts e fare leak dell'indirizzo di puts dalla GOT e un ROP gadget per chiamare system('/bin/sh')
.
64 bit, ASLR abilitato, nessun canary, stack overflow in main da una funzione figlia. ROP gadget per chiamare puts per fare leak dell'indirizzo di puts dalla GOT e poi chiamare un one gadget.