House of Orange

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

मूलभूत जानकारी

कोड

लक्ष्य

  • malloc_printerr फ़ंक्शन का दुरुपयोग करें

आवश्यकताएँ

  • ऊपरी चंक का आकार अधिलेखित करें

  • Libc और हीप लीक्स

पृष्ठभूमि

इस उदाहरण के टिप्पणियों से कुछ आवश्यक पृष्ठभूमि:

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

हमला

हमला शुरू होता है जब अनसॉर्टेड बिन में टॉप चंक प्राप्त किया जाता है। इसे mmap आवंटन को ट्रिगर करने वाले mmp_.mmap_threshold (डिफ़ॉल्ट 128K है) से छोटा लेकिन वर्तमान शीर्ष चंक के आकार से अधिक आकार के साथ malloc को कॉल करके प्राप्त किया जाता है। जब भी शीर्ष चंक का आकार संशोधित किया जाता है, तो महत्वपूर्ण है कि शीर्ष चंक + इसका आकार पेज-संरेखित हो और पिछला_इन्यूज़ बिट हमेशा सेट रहे।

अनसॉर्टेड बिन में शीर्ष चंक प्राप्त करने के लिए, शीर्ष चंक बनाने के लिए एक चंक आवंटित करें, शीर्ष चंक का आकार बदलें (आवंटित चंक में ओवरफ़्लो के साथ) ताकि शीर्ष चंक + आकार पेज-संरेखित हो और पिछला_इन्यूज़ बिट सेट हो। फिर नए शीर्ष चंक के आकार से अधिक एक चंक आवंटित करें। ध्यान दें कि शीर्ष चंक को अनसॉर्टेड बिन में प्राप्त करने के लिए कभी मुक्त कॉल नहीं किया जाता है।

पुराना शीर्ष चंक अब अनसॉर्टेड बिन में है। माना जा सकता है कि हम उसमें से डेटा पढ़ सकते हैं (संभावित रूप से एक विकल्पना जिसने ओवरफ़्लो का कारण भी था), तो उससे libc पतों को लीक करना संभव है और _IO_list_all का पता लगाना संभव है।

अनसॉर्टेड बिन हमला एक ओवरफ़्लो का दुरुपयोग करके topChunk->bk->fwd = _IO_list_all - 0x10 लिखकर किया जाता है। जब एक नया चंक आवंटित किया जाता है, तो पुराना शीर्ष चंक विभाजित हो जाएगा, और अनसॉर्टेड बिन के लिए एक पॉइंटर _IO_list_all में लिखा जाएगा।

अगला कदम पुराने शीर्ष चंक का आकार छोटा करना है ताकि एक छोटे बिन में फिट हो, विशेष रूप से उसका आकार 0x61 सेट करना। इसके दो उद्देश्य हैं:

  1. छोटे बिन 4 में इन्सर्शन: जब malloc अनसॉर्टेड बिन के माध्यम से स्कैन करता है और इस चंक को देखता है, तो यह इसे छोटे बिन 4 में डालने का प्रयास करेगा जिसका कारण इसके छोटे आकार के कारण होगा। यह चंक छोटे बिन 4 की सूची के शीर्ष पर जाता है जो _IO_list_all के चंक के FD पॉइंटर का स्थान है क्योंकि हमने अनसॉर्टेड बिन हमले के माध्यम से _IO_list_all में एक क्लोज पता लिखा था।

  2. मैलोक चेक को ट्रिगर करना: यह चंक आकार मानिपुलेशन malloc को आंतरिक जांच करने के लिए कारण बनाएगा। जब यह झूठी फॉरवर्ड चंक का आकार जांचता है, जो शून्य होगा, तो यह एक त्रुटि को ट्रिगर करेगा और malloc_printerr को कॉल करेगा।

छोटे बिन का मानिपुलेशन आपको चंक के फॉरवर्ड पॉइंटर को नियंत्रित करने की अनुमति देगा। _IO_list_all के साथ ओवरलैप का उपयोग एक जाली _IO_FILE संरचना बनाने के लिए किया जाता है। संरचना को सावधानीपूर्वक तैयार किया जाता है ताकि इसमें _IO_write_base और _IO_write_ptr जैसे महत्वपूर्ण फ़ील्ड्स शामिल हों जो libc में आंतरिक जांचों को पार करने वाले मान्यताएँ सेट करें। इसके अतिरिक्त, एक जंप टेबल जाली संरचना के भीतर बनाई जाती है, जहां एक निर्देशिका पॉइंटर को एक पते पर सेट किया जाता है जहां विभिन्न कोड (उदाहरण के लिए, system फ़ंक्शन) को क्रियान्वित किया जा सकता है।

तकनीक के शेष हिस्से को सारांशित करने के लिए:

  • पुराने शीर्ष चंक को छोटा करें: पुराने शीर्ष चंक का आकार समायोजित करें ताकि इसे छोटे बिन में फिट किया जा सके।


संदर्भ

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

Last updated