hacktricks/binary-exploitation/heap/large-bin-attack.md

6.4 KiB

बड़े बिन हमला

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

मौलिक जानकारी

बड़े बिन क्या है इसके बारे में अधिक जानकारी के लिए इस पेज की जाँच करें:

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

एक शानदार उदाहरण मिल सकता है how2heap - large bin attack में।

मुख्य रूप से यहाँ आप देख सकते हैं कि, नवीनतम "वर्तमान" संस्करण जीलिबी (2.35) में यह नहीं जांचा गया है: P->bk_nextsize जिससे कि यदि कुछ शर्तें पूरी होती हैं तो एक बड़े बिन चंक के मान के साथ किसी भी पता को संशोधित करने की अनुमति है।

उस उदाहरण में आप निम्नलिखित शर्तें पाएंगे:

  • एक बड़ा चंक आवंटित किया गया है
  • पहले चंक से छोटा एक बड़ा चंक उसी सूचक में आवंटित किया गया है
  • इसे इसलिए छोटा होना चाहिए क्योंकि यह बिन में पहले जाना चाहिए
  • (शीर्ष चंक के साथ मिलावट को रोकने के लिए एक चंक बनाया गया है)
  • फिर, पहला बड़ा चंक मुक्त किया जाता है और उससे बड़ा नया चंक आवंटित किया जाता है -> चंक1 बड़े बिन में जाता है
  • फिर, दूसरा बड़ा चंक मुक्त किया जाता है
  • अब, सुरक्षा गड़बड़ी: हमलावर chunk1->bk_nextsize को [लक्ष्य-0x20] पर संशोधित कर सकता है
  • फिर, चंक 2 से बड़ा चंक आवंटित किया जाता है, इसलिए चंक2 बड़े बिन में डाला जाता है और पता chunk1->bk_nextsize->fd_nextsize को चंक2 के पते से अधिलेखित कर दिया जाता है

{% hint style="success" %} अन्य संभावित परिदृश्य हैं, यह बड़े बिन में एक चंक जो किसी वर्तमान X चंक से छोटा है जोड़ने के लिए है, इसलिए यह बिन में उससे पहले डालने की आवश्यकता है, और हमें X को संशोधित करने की क्षमता होनी चाहिए bk_nextsize क्योंकि वहाँ छोटे चंक का पता लिखा जाएगा। {% endhint %}

यह मैलोक कोड malloc से है। टिप्पणियाँ बेहतर समझने के लिए जो पता अधिलेखित किया गया था, उन्हें जोड़ दिया गया है:

/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
{
fwd = bck; // fwd = p1
bck = bck->bk; // bck = p1->bk

victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}

{% endcode %}

इसका उपयोग libc के global_max_fast ग्लोबल वेरिएबल को ओवरराइट करने के लिए किया जा सकता है ताकि फिर बड़े चंक्स के साथ एक फास्ट बिन हमला किया जा सके।

आप इस हमले की एक और शानदार व्याख्या guyinatuxedo में पा सकते हैं।