GNU obstack function-pointer hijack
Tip
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)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
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 HackTricks y HackTricks Cloud repositorios de github.
Visión general
GNU obstacks almacenan el estado del allocator junto con dos objetivos de llamada indirecta:
chunkfun(offset+0x38) con la firmavoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) con la firmavoid (*freefun)(void *, void *)extra_argy una banderause_extra_argseleccionan si_obstack_newchunkllama achunkfun(new_size)o achunkfun(extra_arg, new_size)
Si un atacante puede corromper un struct obstack * perteneciente a la aplicación o sus campos, el siguiente crecimiento del obstack (cuando next_free == chunk_limit) desencadena una llamada indirecta a través de chunkfun, permitiendo primitivas de ejecución de código.
Primitive: size_t desync → 0-byte allocation → pointer OOB write
Un patrón de bug común es usar un registro de 32 bits para calcular sizeof(ptr) * count mientras se almacena la longitud lógica en un size_t de 64 bits.
- Ejemplo:
elements = obstack_alloc(obs, sizeof(void *) * size);se compila comoSHL EAX,0x3parasize << 3. - Con
size = 0x20000000ysizeof(void *) = 8, la multiplicación desborda a0x0en 32 bits, por lo que el array de punteros tiene 0 bytes, pero elsizeregistrado permanece0x20000000. - Las escrituras posteriores
elements[curr++] = ptr;realizan almacenamientos de punteros OOB de 8 bytes en objetos heap adyacentes, proporcionando una primitiva de sobreescritura cruzada controlada.
Leaking libc via obstack.chunkfun
- Coloca dos objetos heap adyacentes (p. ej., dos stacks construidos con obstacks separados).
- Usa el write OOB del array de punteros desde el objeto A para sobrescribir el puntero
elementsdel objeto B de modo que unpop/read desde B desreferencie una dirección dentro del obstack del objeto A. - Lee
chunkfun(mallocpor defecto) en el offset0x38para divulgar un puntero a función de libc, luego calculalibc_base = leak - malloc_offsety deriva otros símbolos (p. ej.,system,"/bin/sh").
Hijacking chunkfun with a fake obstack
Sobrescribe el struct obstack * almacenado de la víctima para apuntar a datos controlados por el atacante que imitan el header del obstack. Campos mínimos necesarios:
next_free == chunk_limitpara forzar_obstack_newchunken el siguiente pushchunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1para seleccionar la forma de llamada con dos argumentos
Luego provoca una asignación en el obstack de la víctima para ejecutar system("/bin/sh") a través de la llamada indirecta.
Ejemplo fake obstack layout (glibc 2.42 offsets):
fake = b""
fake += p64(0x1000) # chunk_size
fake += p64(heap_leak) # chunk
fake += p64(heap_leak) # object_base
fake += p64(heap_leak) # next_free == chunk_limit
fake += p64(heap_leak) # chunk_limit
fake += p64(0xF) # alignment_mask
fake += p64(0) # temp
fake += p64(system_addr) # chunkfun
fake += p64(0) # freefun
fake += p64(binsh_addr) # extra_arg
fake += p64(1) # use_extra_arg flag set
Receta de ataque
- Trigger size wrap para crear un 0-byte pointer array con una enorme longitud lógica.
- Groom adjacency para que un OOB pointer store alcance un objeto vecino que contiene un obstack pointer.
- Leak libc redireccionando un victim pointer al
chunkfundel obstack vecino y leyendo el puntero a función. - Forge obstack datos con
chunkfun/extra_argcontrolados y forzar_obstack_newchunkpara que aterrice en el encabezado forjado, produciendo una llamada por puntero a función a elección del atacante.
Referencias
Tip
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)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
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 HackTricks y HackTricks Cloud repositorios de github.


