WWW2Exec - __malloc_hook & __free_hook

हैकट्रिक्स का समर्थन करें

मैलोक हुक

जैसा कि आप आधिकारिक जीएनयू साइट से जान सकते हैं, चर __malloc_hook एक पॉइंटर है जो malloc() को कॉल करने पर बुलाई जाएगी उस फ़ंक्शन के पते की ओर पॉइंट करता है जो लिबसी पुस्तकालय के डेटा सेक्शन में स्टोर होता है। इसलिए, यदि इस पते को ओवरराइट किया जाता है एक वन गैजेट के साथ उदाहरण के लिए और malloc को कॉल किया जाता है, तो वन गैजेट को कॉल किया जाएगा

malloc को कॉल करने के लिए कार्यक्रम को इसे कॉल करने का इंतजार करना संभव है या printf("%10000$c") को कॉल करके जिससे बहुत सारे बाइट्स आवंटित हो जाएं जिससे libc को उन्हें हीप में आवंटित करने के लिए malloc को कॉल करना पड़े।

वन गैजेट के बारे में अधिक जानकारी:

One Gadget

ध्यान दें कि हुक GLIBC >= 2.34 के लिए अक्षम हैं। आधुनिक GLIBC संस्करणों पर उपयोग किए जा सकने वाले अन्य तकनीक हैं। देखें: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md

फ्री हुक

इसे एक उदाहरण में दुरुपयोग किया गया था पेज से एक तेज बिन हमल के बाद एक अनुक्रमित बिन हमल का:

Unsorted Bin Attack

यदि बाइनरी में प्रतीक हैं, तो निम्नलिखित कमांड के साथ __free_hook का पता लगाना संभव है:

gef➤  p &__free_hook

इस पोस्ट में आपको सिखाया गया है कि कैसे सिम्बल के बिना फ्री हुक का पता लगाया जा सकता है। सारांश में, फ्री फंक्शन में:

gef➤  x/20i free
0xf75dedc0 <free>: push   ebx
0xf75dedc1 <free+1>: call   0xf768f625
0xf75dedc6 <free+6>: add    ebx,0x14323a
0xf75dedcc <free+12>:  sub    esp,0x8
0xf75dedcf <free+15>:  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 <free+21>:  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 <free+25>:  mov    eax,DWORD PTR [eax]--- यहाँ ब्रेक करें
0xf75deddb <free+27>:  test   eax,eax ;<
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>

पिछले कोड में उल्लिखित ब्रेक में $eax में फ्री हुक का पता होगा।

अब एक फास्ट बिन हमला किया जाता है:

  • सबसे पहले यह पता चलता है कि __free_hook स्थान पर फास्ट चंक्स के आकार 200 के साथ काम करना संभव है:

  • gef➤  p &__free_hook

$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000

  • अगर हम इस स्थान पर आकार 0x200 के एक फास्ट चंक प्राप्त कर पाते हैं, तो एक फ़ंक्शन प्वाइंटर को ओवरराइट करना संभव होगा जो कार्यात्मक होगा

  • इसके लिए, आकार 0xfc का एक नया चंक बनाया जाता है और मर्ज़ किया गया फ़ंक्शन उस प्वाइंटर के साथ दो बार कॉल किया जाता है, इस तरह हम फास्ट बिन में आकार 0xfc*2 = 0x1f8 के एक फ्री चंक का प्वाइंटर प्राप्त करते हैं।

  • फिर, इस चंक में fd पता संशोधित करने के लिए संपादन फ़ंक्शन को कॉल किया जाता है ताकि यह फास्ट बिन पिछले __free_hook फ़ंक्शन को पॉइंट करे।

  • फिर, आकार 0x1f8 के एक चंक बनाया जाता है ताकि फास्ट बिन से पिछले बेकार चंक को पुनः प्राप्त किया जा सके ताकि __free_hook में एक फास्ट बिन चंक प्राप्त किया जा सके जिसे system फ़ंक्शन के पते से ओवरराइट किया जाता है।

  • और अंत में /bin/sh\x00 स्ट्रिंग को समेटने वाला एक चंक मुक्त किया जाता है डिलीट फ़ंक्शन को कॉल करके, जो __free_hook फ़ंक्शन को ट्रिगर करता है जो सिस्टम के साथ /bin/sh\x00 के पैरामीटर के साथ पॉइंट करता है।

संदर्भ

हैकट्रिक्स का समर्थन करें

Last updated