mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
53 lines
3.1 KiB
Markdown
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}}
|