mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
71 lines
4.5 KiB
Markdown
71 lines
4.5 KiB
Markdown
# WWW2Exec - \_\_malloc_hook & \_\_free_hook
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## **Malloc Hook**
|
|
|
|
Come puoi vedere nel [sito ufficiale GNU](https://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html), 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**, ad 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 nel heap.
|
|
|
|
Ulteriori informazioni su One Gadget in:
|
|
|
|
{{#ref}}
|
|
../rop-return-oriented-programing/ret2lib/one-gadget.md
|
|
{{#endref}}
|
|
|
|
> [!WARNING]
|
|
> Nota 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](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
|
|
|
|
## Free Hook
|
|
|
|
Questo è stato abusato in uno degli esempi della pagina che sfrutta un attacco fast bin dopo aver abusato di un attacco unsorted bin:
|
|
|
|
{{#ref}}
|
|
../libc-heap/unsorted-bin-attack.md
|
|
{{#endref}}
|
|
|
|
È possibile trovare l'indirizzo di `__free_hook` se il binario ha simboli con il seguente comando:
|
|
```bash
|
|
gef➤ p &__free_hook
|
|
```
|
|
[Nel post](https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html) puoi trovare una guida passo passo su come localizzare l'indirizzo del free hook senza simboli. In sintesi, nella funzione free:
|
|
|
|
<pre class="language-armasm"><code class="lang-armasm">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]
|
|
<strong>0xf75dedd9 <free+25>: mov eax,DWORD PTR [eax]--- BREAK HERE
|
|
</strong>0xf75deddb <free+27>: test eax,eax ;<
|
|
0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
|
|
</code></pre>
|
|
|
|
Nel punto di interruzione menzionato nel codice precedente, in `$eax` si troverà l'indirizzo del free hook.
|
|
|
|
Ora viene eseguito un **fast bin attack**:
|
|
|
|
- Prima di tutto si scopre che è possibile lavorare con fast **chunks di dimensione 200** nella posizione **`__free_hook`**:
|
|
- <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
|
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
|
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
|
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
|
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
|
|
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
|
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
|
</code></pre>
|
|
- 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.
|
|
|
|
## Riferimenti
|
|
|
|
- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
|
- [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|