Aprende y practica Hacking en AWS:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Aprende y practica Hacking en GCP: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* ¡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).
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.
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).
- 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.