House of Orange
मूलभूत जानकारी
कोड
https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_orange.c में एक उदाहरण खोजें
इस पैच में एक्सप्लोइटेशन तकनीक ठीक की गई थी (2.26 से पहले काम करती थी)
अधिक टिप्पणियों के साथ समान उदाहरण https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html में
लक्ष्य
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 सेट करना। इसके दो उद्देश्य हैं:
छोटे बिन 4 में इन्सर्शन: जब
malloc
अनसॉर्टेड बिन के माध्यम से स्कैन करता है और इस चंक को देखता है, तो यह इसे छोटे बिन 4 में डालने का प्रयास करेगा जिसका कारण इसके छोटे आकार के कारण होगा। यह चंक छोटे बिन 4 की सूची के शीर्ष पर जाता है जो_IO_list_all
के चंक के FD पॉइंटर का स्थान है क्योंकि हमने अनसॉर्टेड बिन हमले के माध्यम से_IO_list_all
में एक क्लोज पता लिखा था।मैलोक चेक को ट्रिगर करना: यह चंक आकार मानिपुलेशन
malloc
को आंतरिक जांच करने के लिए कारण बनाएगा। जब यह झूठी फॉरवर्ड चंक का आकार जांचता है, जो शून्य होगा, तो यह एक त्रुटि को ट्रिगर करेगा औरmalloc_printerr
को कॉल करेगा।
छोटे बिन का मानिपुलेशन आपको चंक के फॉरवर्ड पॉइंटर को नियंत्रित करने की अनुमति देगा। _IO_list_all के साथ ओवरलैप का उपयोग एक जाली _IO_FILE संरचना बनाने के लिए किया जाता है। संरचना को सावधानीपूर्वक तैयार किया जाता है ताकि इसमें _IO_write_base
और _IO_write_ptr
जैसे महत्वपूर्ण फ़ील्ड्स शामिल हों जो libc में आंतरिक जांचों को पार करने वाले मान्यताएँ सेट करें। इसके अतिरिक्त, एक जंप टेबल जाली संरचना के भीतर बनाई जाती है, जहां एक निर्देशिका पॉइंटर को एक पते पर सेट किया जाता है जहां विभिन्न कोड (उदाहरण के लिए, system
फ़ंक्शन) को क्रियान्वित किया जा सकता है।
तकनीक के शेष हिस्से को सारांशित करने के लिए:
पुराने शीर्ष चंक को छोटा करें: पुराने शीर्ष चंक का आकार समायोजित करें ताकि इसे छोटे बिन में फिट किया जा सके।
संदर्भ
Last updated