WWW2Exec - .dtors & .fini_array
Reading time: 3 minutes
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
.dtors
caution
Al giorno d'oggi è molto strano trovare un binario con una sezione .dtors!
I distruttori sono funzioni che vengono eseguite prima che il programma finisca (dopo che la funzione main
restituisce).
Gli indirizzi di queste funzioni sono memorizzati all'interno della sezione .dtors
del binario e quindi, se riesci a scrivere l'indirizzo in un shellcode in __DTOR_END__
, questo sarà eseguito prima che il programma termini.
Ottieni l'indirizzo di questa sezione con:
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”
Di solito troverai i marcatori DTOR tra i valori ffffffff
e 00000000
. Quindi, se vedi solo quei valori, significa che non ci sono funzioni registrate. Quindi sovrascrivi il 00000000
con l'indirizzo del shellcode per eseguirlo.
warning
Ovviamente, devi prima trovare un luogo per memorizzare il shellcode per poterlo chiamare successivamente.
.fini_array
Essenzialmente, questa è una struttura con funzioni che verranno chiamate prima che il programma finisca, come .dtors
. Questo è interessante se puoi chiamare il tuo shellcode semplicemente saltando a un indirizzo, o nei casi in cui devi tornare di nuovo a main
per sfruttare la vulnerabilità una seconda volta.
objdump -s -j .fini_array ./greeting
./greeting: file format elf32-i386
Contents of section .fini_array:
8049934 a0850408
#Put your address in 0x8049934
Nota che quando una funzione da .fini_array
viene eseguita, passa alla successiva, quindi non verrà eseguita più volte (prevenendo cicli eterni), ma darà solo 1 esecuzione della funzione posizionata qui.
Nota che le voci in .fini_array
vengono chiamate in ordine inverso, quindi probabilmente vorrai iniziare a scrivere dall'ultima.
Ciclo eterno
Per abusare di .fini_array
per ottenere un ciclo eterno puoi controllare cosa è stato fatto qui: Se hai almeno 2 voci in .fini_array
, puoi:
- Usare la tua prima scrittura per richiamare di nuovo la funzione vulnerabile di scrittura arbitraria
- Poi, calcolare l'indirizzo di ritorno nello stack memorizzato da
__libc_csu_fini
(la funzione che chiama tutte le funzioni di.fini_array
) e mettere lì l'indirizzo di__libc_csu_fini
- Questo farà sì che
__libc_csu_fini
chiami di nuovo se stesso eseguendo di nuovo le funzioni di.fini_array
, che chiameranno la funzione WWW vulnerabile 2 volte: una per scrittura arbitraria e un'altra per sovrascrivere di nuovo l'indirizzo di ritorno di__libc_csu_fini
nello stack per chiamare di nuovo se stesso.
caution
Nota che con Full RELRO, la sezione .fini_array
è resa sola lettura.
Nelle versioni più recenti, anche con [Partial RELRO] la sezione .fini_array
è resa sola lettura.
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.