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

5.3 KiB

WWW2Exec - .dtors & .fini_array

{% hint style="success" %} Impara & pratica l'Hacking su AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara & pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)

Sostieni HackTricks
{% endhint %}

.dtors

{% hint style="danger" %} Oggi è molto strano trovare un binario con una sezione .dtors! {% endhint %}

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.

{% hint style="warning" %} Naturalmente, prima devi trovare un posto dove memorizzare lo shellcode per poterlo chiamare successivamente. {% endhint %}

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

{% hint style="danger" %} 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. {% endhint %}

{% hint style="success" %} 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
{% endhint %}