hacktricks/src/binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md

53 lines
3.1 KiB
Markdown

# 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}}