GNU obstack function-pointer hijack
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Überblick
GNU obstacks betten den Allocator-Zustand zusammen mit zwei indirekten Aufrufzielen ein:
chunkfun(offset+0x38) with signaturevoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) with signaturevoid (*freefun)(void *, void *)extra_argand ause_extra_argflag select whether_obstack_newchunkcallschunkfun(new_size)orchunkfun(extra_arg, new_size)
Wenn ein Angreifer ein an die Anwendung gehörendes struct obstack * oder dessen Felder korrumpieren kann, löst das nächste Wachsen des obstack (wenn next_free == chunk_limit) einen indirekten Aufruf über chunkfun aus und ermöglicht Primitiven zur Codeausführung.
Primitive: size_t desync → 0-byte allocation → pointer OOB write
Ein häufiges Bug-Muster ist die Verwendung eines 32-bit Registers zur Berechnung von sizeof(ptr) * count, während die logische Länge in einem 64-bit size_t gespeichert wird.
- Beispiel:
elements = obstack_alloc(obs, sizeof(void *) * size);is compiled asSHL EAX,0x3forsize << 3. - Bei
size = 0x20000000undsizeof(void *) = 8überläuft die Multiplikation in 32-bit auf0x0, sodass das Pointer-Array 0 bytes groß ist, aber das aufgezeichnetesizeweiterhin0x20000000bleibt. - Anschließende
elements[curr++] = ptr;-Schreibvorgänge führen zu 8-byte OOB pointer stores in benachbarte Heap-Objekte und liefern ein kontrolliertes cross-object overwrite-Primitive.
Leaking libc via obstack.chunkfun
- Platziere zwei Heap-Objekte nebeneinander (z. B. zwei Stacks, die mit separaten obstacks gebaut wurden).
- Nutze den pointer-array OOB write aus Objekt A, um den
elements-Pointer von Objekt B so zu überschreiben, dass einpop/Lesezugriff von B eine Adresse innerhalb von Objekt A’s obstack dereferenziert. - Lese
chunkfun(mallocby default) bei Offset0x38, um einen libc-Funktionspointer offenzulegen, berechne dannlibc_base = leak - malloc_offsetund leite andere Symbole ab (z. B.system,"/bin/sh").
Hijacking chunkfun with a fake obstack
Überschreibe das gespeicherte struct obstack * des Opfers so, dass es auf angreiferkontrollierte Daten zeigt, die den obstack-Header nachahmen. Minimal benötigte Felder:
next_free == chunk_limitto force_obstack_newchunkon next pushchunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1to select the two-argument call form
Dann löse eine Allokation auf dem Opfer-obstack aus, um system("/bin/sh") über den indirekten Aufruf auszuführen.
Beispiel für ein gefälschtes 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
Angriffsrezept
- Trigger size wrap um ein 0-byte pointer array mit sehr großer logischer Länge zu erstellen.
- Groom adjacency sodass ein OOB pointer store ein benachbartes Objekt erreicht, das einen obstack-Pointer enthält.
- Leak libc indem ein victim-Pointer auf das benachbarte obstack’s
chunkfunumgeleitet und der Function-Pointer ausgelesen wird. - Forge obstack Daten mit kontrolliertem
chunkfun/extra_argfälschen und_obstack_newchunkdazu zwingen, im gefälschten Header zu landen, wodurch ein Funktionszeigeraufruf nach Wahl des Angreifers ausgelöst wird.
Referenzen
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
HackTricks

