# WWW2Exec - .dtors & .fini_array {{#include ../../banners/hacktricks-training.md}} ## .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**](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)**:** 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**](../common-binary-protections-and-bypasses/relro.md)**,** la sezione **`.fini_array`** è resa **sola lettura**. > Nelle versioni più recenti, anche con [**Partial RELRO**] la sezione **`.fini_array`** è resa **sola lettura**. {{#include ../../banners/hacktricks-training.md}}