WWW2Exec - .dtors & .fini_array
Last updated
Last updated
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
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 a un shellcode in __DTOR_END__
, questo sarà eseguito prima che il programma termini.
Ottieni l'indirizzo di questa sezione con:
Di solito troverai i marcatori DTOR tra i valori ffffffff
e 00000000
. Quindi, se vedi solo quei valori, significa che non c'è alcuna funzione registrata. Quindi sovrascrivi il 00000000
con l'indirizzo al shellcode per eseguirlo.
Certo, devi prima trovare un luogo per memorizzare il shellcode per poterlo chiamare successivamente.
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.
Note 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.
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.
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.
Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)