WWW2Exec - __malloc_hook & __free_hook
Last updated
Last updated
Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Come puoi vedere nel sito ufficiale GNU, la variabile __malloc_hook
è un puntatore che punta all'indirizzo di una funzione che verrà chiamata ogni volta che viene chiamato malloc()
, memorizzato nella sezione dati della libreria libc. Pertanto, se questo indirizzo viene sovrascritto con un One Gadget per esempio e viene chiamato malloc
, il One Gadget verrà chiamato.
Per chiamare malloc è possibile aspettare che il programma lo chiami o **chiamando printf("%10000$c")** che alloca troppi byte facendo sì che
libc` chiami malloc per allocarli nell'heap.
Ulteriori informazioni su One Gadget in:
One GadgetNota che i hook sono disabilitati per GLIBC >= 2.34. Ci sono altre tecniche che possono essere utilizzate su versioni moderne di GLIBC. Vedi: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
Questo è stato abusato in uno degli esempi della pagina che sfrutta un attacco fast bin dopo aver abusato di un attacco unsorted bin:
Unsorted Bin AttackÈ possibile trovare l'indirizzo di __free_hook
se il binario ha simboli con il seguente comando:
Nel post puoi trovare una guida passo passo su come localizzare l'indirizzo del free hook senza simboli. In sintesi, nella funzione free:
Nel break menzionato nel codice precedente, in $eax
si troverà l'indirizzo del free hook.
Ora viene eseguito un attacco fast bin:
Prima di tutto si scopre che è possibile lavorare con fast chunk di dimensione 200 nella posizione __free_hook
:
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
Se riusciamo a ottenere un fast chunk di dimensione 0x200 in questa posizione, sarà possibile sovrascrivere un puntatore a funzione che verrà eseguito.
Per questo, viene creato un nuovo chunk di dimensione 0xfc
e la funzione unita viene chiamata con quel puntatore due volte, in questo modo otteniamo un puntatore a un chunk liberato di dimensione 0xfc*2 = 0x1f8
nel fast bin.
Poi, la funzione di modifica viene chiamata in questo chunk per modificare l'indirizzo fd
di questo fast bin per puntare alla precedente funzione __free_hook
.
Successivamente, viene creato un chunk di dimensione 0x1f8
per recuperare dal fast bin il precedente chunk inutile, quindi viene creato un altro chunk di dimensione 0x1f8
per ottenere un fast bin chunk nella __free_hook
che viene sovrascritto con l'indirizzo della funzione system
.
E infine, viene liberato un chunk contenente la stringa /bin/sh\x00
chiamando la funzione di eliminazione, attivando la funzione __free_hook
che punta a system con /bin/sh\x00
come parametro.
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)