WWW2Exec - .dtors & .fini_array

Sostieni HackTricks

.dtors

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:

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 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.

.fini_array

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.

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 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.

Loop eterno

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.

Supporta HackTricks

Last updated