WWW2Exec - .dtors & .fini_array
Last updated
Last updated
Impara & pratica l'Hacking su AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara & pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)
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
ritorna).
Gli indirizzi di queste funzioni sono memorizzati all'interno della sezione .dtors
del binario e quindi, se riesci a scrivere l'indirizzo di uno shellcode in __DTOR_END__
, questo verrà eseguito prima che il programma finisca.
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 dello shellcode per eseguirlo.
Naturalmente, prima devi trovare un posto dove memorizzare lo shellcode per poterlo chiamare successivamente.
Essenzialmente si tratta di una struttura con funzioni che verranno chiamate prima che il programma finisca, come .dtors
. Questo è interessante se puoi chiamare il tuo shellcode saltando a un indirizzo, o nei casi in cui devi tornare di nuovo a main
per sfruttare la vulnerabilità una seconda volta.
Nota che quando una funzione dall'.fini_array
viene eseguita, passa alla successiva, quindi non verrà eseguita più volte (prevenendo loop eterni), ma ti darà solo 1 esecuzione della funzione posizionata qui.
Nota che le voci in .fini_array
sono chiamate in ordine inverso, quindi probabilmente vuoi iniziare a scrivere dall'ultima.
Per abusare di .fini_array
per ottenere un loop eterno puoi controllare cosa è stato fatto qui: Se hai almeno 2 voci in .fini_array
, puoi:
Utilizzare il tuo primo write per chiamare di nuovo la funzione di scrittura arbitraria vulnerabile
Quindi, calcolare l'indirizzo di ritorno nello stack memorizzato da __libc_csu_fini
(la funzione che sta chiamando tutte le funzioni di .fini_array
) e metterci lì l'indirizzo di __libc_csu_fini
Questo farà sì che __libc_csu_fini
si chiami di nuovo eseguendo di nuovo le funzioni di .fini_array
che chiameranno la funzione WWW vulnerabile 2 volte: una per la scrittura arbitraria e un'altra per sovrascrivere di nuovo l'indirizzo di ritorno di __libc_csu_fini
nello stack per chiamarsi di nuovo.
Nota che con Full RELRO, la sezione .fini_array
viene resa sola lettura. Nelle versioni più recenti, anche con [Partial RELRO] la sezione .fini_array
viene resa sola lettura anche.
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)