hacktricks/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md

64 lines
4.6 KiB
Markdown
Raw Normal View History

# WWW2Exec - \_\_malloc\_hook & \_\_free\_hook
{% hint style="success" %}
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Apoya a HackTricks</summary>
* ¡Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
{% endhint %}
## **Malloc Hook**
Según [sitio oficial de GNU](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html), la variable **`__malloc_hook`** es un puntero que apunta a la **dirección de una función que será llamada** cada vez que se llame a `malloc()` **almacenada en la sección de datos de la biblioteca libc**. Por lo tanto, si esta dirección es sobrescrita con un **One Gadget** por ejemplo y se llama a `malloc`, se llamará al **One Gadget**.
Para llamar a malloc es posible esperar a que el programa lo llame o **llamando `printf("%10000$c")`** que asigna demasiados bytes haciendo que `libc` llame a malloc para asignarlos en el heap.
Más información sobre One Gadget en:
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %}
[one-gadget.md](../rop-return-oriented-programing/ret2lib/one-gadget.md)
{% endcontent-ref %}
{% hint style="warning" %}
Ten en cuenta que los hooks están **deshabilitados para GLIBC >= 2.34**. Hay otras técnicas que se pueden utilizar en versiones modernas de GLIBC. Ver: [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).
{% endhint %}
## Free Hook
Esto fue abusado en uno de los ejemplos de la página abusando de un ataque de fast bin después de haber abusado de un ataque de unsorted bin:
{% content-ref url="../libc-heap/unsorted-bin-attack.md" %}
[unsorted-bin-attack.md](../libc-heap/unsorted-bin-attack.md)
{% endcontent-ref %}
Es posible encontrar la dirección de `__free_hook` si el binario tiene símbolos con el siguiente comando:
```bash
gef➤ p &__free_hook
```
En el **break** mencionado en el código anterior en `$eax` estará ubicada la dirección del **`free hook`**.
Ahora se realiza un **ataque de fast bin**:
- En primer lugar se descubre que es posible trabajar con **trozos rápidos de tamaño 200** en la ubicación de **`__free_hook`**:
- `gef➤ p &__free_hook`
- `gef➤ x/60gx 0x7ff1e9e607a8 - 0x59`
- `0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200`
- Si logramos obtener un trozo rápido de tamaño 0x200 en esta ubicación, será posible sobrescribir un puntero de función que se ejecutará.
- Para esto, se crea un nuevo trozo de tamaño `0xfc` y se llama a la función fusionada con ese puntero dos veces, de esta manera obtenemos un puntero a un trozo liberado de tamaño `0xfc*2 = 0x1f8` en el fast bin.
- Luego, se llama a la función de edición en este trozo para modificar la dirección **`fd`** de este fast bin para que apunte a la función anterior de **`__free_hook`**.
- Después, se crea un trozo con tamaño `0x1f8` para recuperar del fast bin el trozo inútil anterior, por lo que se crea otro trozo de tamaño `0x1f8` para obtener un trozo de fast bin en el **`__free_hook`** que se sobrescribe con la dirección de la función **`system`**.
- Y finalmente se libera un trozo que contiene la cadena `/bin/sh\x00` llamando a la función de eliminación, desencadenando la función **`__free_hook`** que apunta a system con `/bin/sh\x00` como parámetro.
## Referencias
- [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).