GNU obstack function-pointer hijack
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Genel Bakış
GNU obstacks, allocator durumunu iki dolaylı çağrı hedefi ile birlikte gömer:
chunkfun(offset+0x38) imzasıvoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) imzasıvoid (*freefun)(void *, void *)extra_argveuse_extra_argbayrağı,_obstack_newchunk’inchunkfun(new_size)mi yoksachunkfun(extra_arg, new_size)mı çağıracağını seçer
Bir saldırgan, uygulamaya ait bir struct obstack * veya onun alanlarını bozabilirse, obstack’in bir sonraki büyümesi (when next_free == chunk_limit) chunkfun üzerinden dolaylı bir çağrıyı tetikler ve kod yürütme primitifleri sağlar.
Primitive: size_t desync → 0-byte allocation → pointer OOB write
Yaygın bir hata deseni, sizeof(ptr) * count hesaplamak için 32-bit register kullanırken mantıksal uzunluğu 64-bit size_t içinde saklamaktır.
- Örnek:
elements = obstack_alloc(obs, sizeof(void *) * size);derlenirkensize << 3içinSHL EAX,0x3olarak üretilir. size = 0x20000000vesizeof(void *) = 8olduğunda, çarpma 32-bit içinde0x0olarak sarılır; böylece pointer dizisi 0 byte olur, fakat kaydedilensize0x20000000olarak kalır.- Takip eden
elements[curr++] = ptr;yazımları, bitişik heap objelerine 8-bayt OOB pointer storelar yapar ve kontrollü cross-object overwrite primitifini sağlar.
Leaking libc via obstack.chunkfun
- İki heap objesini bitişik yerleştir (ör. ayrı obstacks ile oluşturulmuş iki stack).
- Obje A’dan yapılan pointer-array OOB write ile obje B’nin
elementspointer’ını ezerek B’den yapılan birpop/okuma işleminin obje A içindeki bir adresi dereference etmesini sağla. chunkfun’u (varsayılan olarakmalloc) offset0x38’de oku; böylece bir libc function pointer’ı disclose edereklibc_base = leak - malloc_offsethesaplaması yap ve diğer sembolleri (ör.system,"/bin/sh") türet.
Hijacking chunkfun with a fake obstack
Bir mağdurun saklanan struct obstack *’ını, obstack başlığını taklit eden saldırgan kontrollü verilere işaret edecek şekilde ez.
Gerekli asgari alanlar:
- Sonraki push’ta
_obstack_newchunk’i zorlamak içinnext_free == chunk_limit chunkfun = system_addr- İki argümanlı çağrı formunu seçmek için
extra_arg = binsh_addr,use_extra_arg = 1
Sonra mağdur obstack üzerinde bir allocation tetikle ki dolaylı çağrı aracılığıyla system("/bin/sh") çalışsın.
Örnek sahte obstack düzeni (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
Saldırı tarifi
- Trigger size wrap ile büyük bir mantıksal uzunluğa sahip 0-byte pointer array oluşturun.
- Groom adjacency ile bir OOB pointer store’ın obstack pointer içeren bitişik bir nesneye ulaşmasını sağlayın.
- Leak libc — victim pointer’ı komşu obstack’in
chunkfun’ına yönlendirip function pointer’ı okuyarak. - Forge obstack verisini kontrollü
chunkfun/extra_argile sahteleyin ve_obstack_newchunk’ın sahte başlığa düşmesini zorlayın; bu, saldırganın seçtiği bir function-pointer çağrısını sağlar.
Referanslar
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


