WWW2Exec - .dtors & .fini_array
Last updated
Last updated
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)
Hoy en día es muy raro encontrar un binario con una sección .dtors!
Los destructores son funciones que se ejecutan antes de que el programa termine (después de que la función main
regrese).
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 a un shellcode en __DTOR_END__
, eso será ejecutado antes de que el programa termine.
Obtén la dirección de esta sección con:
Usualmente encontrarás los marcadores DTOR entre los valores ffffffff
y 00000000
. Así que si solo ves esos valores, significa que no hay ninguna función registrada. Así que sobrescribe el 00000000
con la dirección al shellcode para ejecutarlo.
Por supuesto, primero necesitas encontrar un lugar para almacenar el shellcode para poder llamarlo más tarde.
Esencialmente, esta es una estructura con funciones que serán llamadas antes de que el programa termine, como .dtors
. Esto es interesante si puedes llamar a tu shellcode simplemente saltando a una dirección, o en casos donde necesitas volver a main
nuevamente para explotar la vulnerabilidad una segunda vez.
Note que cuando se ejecuta una función de la .fini_array
, se pasa a la siguiente, por lo que no se ejecutará varias veces (previniendo bucles eternos), pero también solo te dará 1 ejecución de la función colocada aquí.
Note que las entradas en .fini_array
se llaman en orden inverso, así que probablemente quieras comenzar a escribir desde la última.
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 a la función vulnerable de escritura arbitraria nuevamente
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 poner 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.
Note que con Full RELRO, la sección .fini_array
se vuelve solo lectura. En versiones más nuevas, incluso con [Partial RELRO] la sección .fini_array
también se vuelve solo lectura.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)