GNU obstack function-pointer hijack
Tip
AWS हैकिंग सीखें और अभ्यास करें:
HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें:HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
Overview
GNU obstacks allocator स्थिति को obstack हेडर में एम्बेड करते हैं और दो indirect call targets भी रखते हैं:
chunkfun(offset+0x38) signature के साथvoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) signature के साथvoid (*freefun)(void *, void *)extra_argऔर एकuse_extra_argflag यह चुनते हैं कि_obstack_newchunkchunkfun(new_size)कॉल करे याchunkfun(extra_arg, new_size)
यदि attacker किसी application-owned struct obstack * या उसके fields को corrupt कर सके, तो obstack की अगली growth (जब next_free == chunk_limit) पर _obstack_newchunk के माध्यम से chunkfun पर indirect call ट्रिगर होता है, जिससे code execution primitives संभव हो जाते हैं।
Primitive: size_t desync → 0-byte allocation → pointer OOB write
एक आम बग पैटर्न है कि sizeof(ptr) * count की गणना के लिए 32-bit register का उपयोग किया जाए जबकि logical length 64-bit size_t में स्टोर किया जाता है।
- उदाहरण:
elements = obstack_alloc(obs, sizeof(void *) * size);कोsize << 3के लिएSHL EAX,0x3के रूप में compile किया जाता है। - यदि
size = 0x20000000औरsizeof(void *) = 8, तो multiplication 32-bit में wrap होकर0x0बन जाता है, इसलिए pointer array 0 bytes का होता है, पर रिकॉर्ड की गईsizeबनी रहती है0x20000000। - बाद के
elements[curr++] = ptr;लिखने से adjacent heap objects में 8-byte OOB pointer stores होते हैं, जिससे controlled cross-object overwrite primitive मिलता है।
Leaking libc via obstack.chunkfun
- दो heap objects को adjacent रखें (उदाहरण के लिए, दो अलग obstacks से बने stacks)।
- object A के pointer-array OOB write का उपयोग करके object B के
elementspointer को overwrite करें ताकि B से किया गया एकpop/read object A के obstack के अंदर किसी address को dereference करे। - offset
0x38परchunkfun(mallocby default) पढ़कर एक libc function pointer का leak करें, फिरlibc_base = leak - malloc_offsetसे libc_base निकालें और अन्य symbols निकालें (जैसेsystem,"/bin/sh")।
Hijacking chunkfun with a fake obstack
victim के stored struct obstack * को overwrite करके उसे attacker-controlled data की ओर पॉइंट कराएँ जो obstack header का नक़ल हो। आवश्यक न्यूनतम fields:
next_free == chunk_limitताकि next push पर_obstack_newchunkज़बरदस्त होchunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1ताकि two-argument call form चुना जाए
फिर victim obstack पर एक allocation ट्रिगर करें ताकि indirect call के ज़रिए system("/bin/sh") execute हो।
Example 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
हमले की विधि
- Trigger size wrap ताकि एक 0-byte pointer array बनाई जा सके जिसकी तार्किक लंबाई बहुत बड़ी हो।
- Groom adjacency ताकि एक OOB pointer store पास के ऑब्जेक्ट तक पहुँच जाए जिसमें obstack pointer मौजूद हो।
- Leak libc — एक victim pointer को neighbor obstack के
chunkfunपर redirect करके और function pointer पढ़कर libc leak करें। - Forge obstack — नियंत्रित
chunkfun/extra_argके साथ obstack डेटा बनाकर और_obstack_newchunkको मजबूर करके कि वह जाली हेडर में आए, attacker की पसंद का function-pointer call उत्पन्न करें।
संदर्भ
Tip
AWS हैकिंग सीखें और अभ्यास करें:
HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें:HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।


