WWW2Exec - __malloc_hook & __free_hook

Sostieni HackTricks

Malloc Hook

Come puoi vedere sul sito ufficiale di GNU, la variabile __malloc_hook è un puntatore che punta all'indirizzo di una funzione che verrà chiamata ogni volta che viene chiamato malloc() memorizzata nella sezione dati della libreria libc. Pertanto, se questo indirizzo viene sovrascritto con un One Gadget ad esempio e viene chiamato malloc, verrà chiamato il One Gadget.

Per chiamare malloc è possibile aspettare che il programma lo chiami o chiamando printf("%10000$c") che alloca troppe byte facendo sì che libc chiami malloc per allocarli nell'heap.

Ulteriori informazioni su One Gadget in:

Nota che i hooks sono disabilitati per GLIBC >= 2.34. Ci sono altre tecniche che possono essere utilizzate nelle versioni moderne di GLIBC. Vedi: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.

Free Hook

Questo è stato abusato in uno degli esempi dalla pagina sfruttando un attacco fast bin dopo aver abusato un attacco unsorted bin:

È possibile trovare l'indirizzo di __free_hook se il binario ha simboli con il seguente comando:

gef➤  p &__free_hook

Nel post puoi trovare una guida passo dopo passo su come individuare l'indirizzo del free hook senza simboli. In sintesi, nella funzione free:

gef➤  x/20i free
0xf75dedc0 <free>: push   ebx
0xf75dedc1 <free+1>: call   0xf768f625
0xf75dedc6 <free+6>: add    ebx,0x14323a
0xf75dedcc <free+12>:  sub    esp,0x8
0xf75dedcf <free+15>:  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 <free+21>:  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 <free+25>:  mov    eax,DWORD PTR [eax]--- INTERROMPERE QUI
0xf75deddb <free+27>:  test   eax,eax ;<
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>

Nel punto di interruzione menzionato nel codice precedente, in $eax sarà situato l'indirizzo del free hook.

Ora viene eseguito un attacco fast bin:

  • Prima di tutto si scopre che è possibile lavorare con chunk di dimensione 200 nella posizione __free_hook:

  • gef➤  p &__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 chunk fast di dimensione 0x200 in questa posizione, sarà possibile sovrascrivere un puntatore di funzione che verrà eseguito

  • Per fare ciò, viene creato un nuovo chunk di dimensione 0xfc e la funzione merge 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.

  • Successivamente, viene chiamata la funzione edit in questo chunk per modificare l'indirizzo fd di questo fast bin in modo che punti alla funzione precedente __free_hook.

  • Successivamente, viene creato un chunk di dimensione 0x1f8 per recuperare dal fast bin il chunk inutile precedente, quindi viene creato un altro chunk di dimensione 0x1f8 per ottenere un chunk fast bin nel __free_hook che viene sovrascritto con l'indirizzo della funzione system.

  • Infine, viene liberato un chunk contenente la stringa /bin/sh\x00 chiamando la funzione delete, attivando la funzione __free_hook che punta a system con /bin/sh\x00 come parametro.

Riferimenti

Supporta HackTricks

Last updated