GNU obstack function-pointer hijack
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Przegląd
GNU obstacks osadzają stan alokatora razem z dwoma celami wywołań pośrednich:
chunkfun(offset+0x38) z sygnaturąvoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) z sygnaturąvoid (*freefun)(void *, void *)extra_argoraz flagause_extra_argwybierają, czy_obstack_newchunkwywołachunkfun(new_size)czychunkfun(extra_arg, new_size)
Jeśli atakujący może uszkodzić aplikacyjny struct obstack * lub jego pola, następny wzrost obstacka (gdy next_free == chunk_limit) wywołuje pośrednie wywołanie przez chunkfun, umożliwiając prymitywy wykonywania kodu.
Primitive: size_t desync → 0-byte allocation → pointer OOB write
Częstym wzorcem błędu jest użycie 32-bitowego rejestru do obliczenia sizeof(ptr) * count, podczas gdy logiczna długość jest zapisywana w 64-bitowym size_t.
- Przykład:
elements = obstack_alloc(obs, sizeof(void *) * size);jest skompilowane jakoSHL EAX,0x3dlasize << 3. - Przy
size = 0x20000000isizeof(void *) = 8mnożenie zawija się do0x0w 32-bit, więc tablica wskaźników ma 0 bytes, ale zapisana wartośćsizepozostaje0x20000000. - Kolejne zapisy
elements[curr++] = ptr;powodują 8-byte OOB pointer stores do sąsiednich heap objects, dając kontrolowane nadpisanie między obiektami.
Leaking libc via obstack.chunkfun
- Umieść dwa heap objects obok siebie (np. dwa stosy zbudowane oddzielnymi obstacks).
- Wykorzystaj pointer-array OOB write z obiektu A, aby nadpisać wskaźnik
elementsobiektu B tak, żepop/odczyt z B będzie dereferencjonował adres wewnątrz obstacka obiektu A. - Odczytaj
chunkfun(mallocdomyślnie) na offsetcie0x38, aby ujawnić wskaźnik funkcji libc, następnie obliczlibc_base = leak - malloc_offseti wyprowadź inne symbole (np.system,"/bin/sh").
Hijacking chunkfun with a fake obstack
Nadpisz przechowywany u ofiary struct obstack *, aby wskazywał na dane kontrolowane przez atakującego, które imitują nagłówek obstacka. Minimalne pola potrzebne:
next_free == chunk_limitaby wymusić_obstack_newchunkprzy następnym pushchunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1aby wybrać formę wywołania z dwoma argumentami
Następnie wywołaj alokację na obstacku ofiary, aby wykonać system("/bin/sh") poprzez pośrednie wywołanie.
Przykładowy fałszywy układ obstacka (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
Przepis ataku
- Wywołaj size wrap, aby utworzyć 0-byte pointer array o ogromnej logicznej długości.
- Groom adjacency, tak aby OOB zapis wskaźnika dosięgnął sąsiedniego obiektu zawierającego obstack pointer.
- Leak libc przez przekierowanie victim pointer do sąsiedniego obstack’s
chunkfuni odczytanie function pointer. - Forge obstack data z kontrolowanym
chunkfun/extra_argi zmuś_obstack_newchunk, aby wylądował w sfałszowanym nagłówku, co spowoduje wywołanie function-pointer według wyboru atakującego.
Referencje
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


