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

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

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

bash
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