4.6 KiB
WWW2Exec - __malloc_hook & __free_hook
{% hint style="success" %}
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- ¡Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de Telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.
Malloc Hook
Según sitio oficial de GNU, 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 {% 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. {% 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 {% endcontent-ref %}
Es posible encontrar la dirección de __free_hook
si el binario tiene símbolos con el siguiente comando:
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ño0xfc*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ño0x1f8
para obtener un trozo de fast bin en el__free_hook
que se sobrescribe con la dirección de la funciónsystem
. - 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.