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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR a HackTricks e HackTricks Cloud repos di github.
.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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.