5.4 KiB
WWW2Exec - .dtors & .fini_array
{% 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.
.dtors
{% hint style="danger" %} ¡Hoy en día es muy raro encontrar un binario con una sección .dtors! {% endhint %}
Los destructores son funciones que se ejecutan antes de que el programa termine (después de que la función main
retorne).
Las direcciones de estas funciones se almacenan dentro de la sección .dtors
del binario y, por lo tanto, si logras escribir la dirección de un shellcode en __DTOR_END__
, este se ejecutará antes de que el programa termine.
Obtén la dirección de esta sección con:
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”
Por lo general, encontrarás los marcadores DTOR entre los valores ffffffff
y 00000000
. Entonces, si solo ves esos valores, significa que no hay ninguna función registrada. Por lo tanto, sobrescribe el 00000000
con la dirección del shellcode para ejecutarlo.
{% hint style="warning" %} Por supuesto, primero necesitas encontrar un lugar para almacenar el shellcode para luego llamarlo. {% endhint %}
.fini_array
Básicamente, esta es una estructura con funciones que se llamarán antes de que el programa termine, como .dtors
. Esto es interesante si puedes llamar tu shellcode simplemente saltando a una dirección, o en casos en los que necesitas volver a main
nuevamente para explotar la vulnerabilidad por segunda vez.
objdump -s -j .fini_array ./greeting
./greeting: file format elf32-i386
Contents of section .fini_array:
8049934 a0850408
#Put your address in 0x8049934
Ten en cuenta que cuando se ejecuta una función de .fini_array
se pasa a la siguiente, por lo que no se ejecutará varias veces (evitando bucles eternos), pero también solo te dará 1 ejecución de la función colocada aquí.
Ten en cuenta que las entradas en .fini_array
se llaman en orden inverso, por lo que probablemente quieras comenzar a escribir desde la última.
Bucle eterno
Para abusar de .fini_array
y obtener un bucle eterno puedes ver lo que se hizo aquí: Si tienes al menos 2 entradas en .fini_array
, puedes:
- Usar tu primera escritura para llamar nuevamente a la función de escritura arbitraria vulnerable
- Luego, calcular la dirección de retorno en la pila almacenada por
__libc_csu_fini
(la función que está llamando a todas las funciones de.fini_array
) y colocar allí la dirección de__libc_csu_fini
- Esto hará que
__libc_csu_fini
se llame a sí mismo nuevamente ejecutando las funciones de.fini_array
nuevamente, lo que llamará a la función WWW vulnerable 2 veces: una para escritura arbitraria y otra para sobrescribir nuevamente la dirección de retorno de__libc_csu_fini
en la pila para llamarse a sí mismo nuevamente.
{% hint style="danger" %}
Ten en cuenta que con Full RELRO, la sección .fini_array
se vuelve de solo lectura.
En versiones más nuevas, incluso con [Partial RELRO] la sección .fini_array
también se vuelve de solo lectura.
{% endhint %}
{% 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
- ¡Consulta 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.