Off by one overflow
मूल जानकारी
केवल 1B ओवरफ्लो तक पहुंचने से हमलावर को अगले चंक के size
फ़ील्ड को संशोधित करने की अनुमति होती है। इससे यह संभव होता है कि कौन से चंक मुक्त होते हैं, जिससे एक चंक उत्पन्न हो सकता है जो एक और वैध चंक को शामिल करता है। उत्पादन डबल फ्री या ओवरलैपिंग चंक के समान है।
दो प्रकार की ऑफ बाई वन वंशगताएँ हैं:
अर्बिट्रेरी बाइट: यह प्रकार किसी भी मान के साथ उस बाइट को अधिलेखित करने की अनुमति देता है
नल बाइट (ऑफ-बाई-नल): यह प्रकार केवल 0x00 के साथ उस बाइट को अधिलेखित करने की अनुमति देता है
इस जोखिम का एक सामान्य उदाहरण निम्नलिखित कोड में देखा जा सकता है जहाँ
strlen
औरstrcpy
का व्यवहार असंगत है, जिससे अगले चंक की शुरुआत में 0x00 बाइट सेट किया जा सकता है।इसे House of Einherjar के साथ उत्पादित किया जा सकता है।
Tcache का उपयोग करते समय, इसे डबल फ्री स्थिति में उन्नत किया जा सकता है।
मध्य अन्य जांचों के बीच, अब जब भी एक चंक मुक्त होता है, पिछला आकार मेटाडेटा के चंक में कॉन्फ़िगर किए गए आकार के साथ तुलना की जाती है, जिससे यह हमला संस्करण 2.28 से काफी जटिल बन जाता है।
कोड उदाहरण:
यह हमला Tcaches का उपयोग करने के कारण अब काम नहीं कर रहा है।
इसके अतिरिक्त, यदि आप इसका दुरुपयोग करने की कोशिश करते हैं बड़े चंक्स का उपयोग करके (ताकि tcaches शामिल न हों), तो आपको त्रुटि मिलेगी:
malloc(): invalid next size (unsorted)
लक्ष्य
एक चंक को दूसरे चंक में शामिल करना ताकि दूसरे चंक पर लेखन पहुंच दें जिससे शामिल एक को अधिक लिखने की अनुमति हो
आवश्यकताएं
आकार मेटाडेटा सूचना को संशोधित करने के लिए एक ऑफ बाई वन ओवरफ्लो
सामान्य ऑफ-बाई-वन हमला
तीन चंक
A
,B
औरC
(कहें आकार 0x20) का आवंटन करें, और ऊपरी चंक के साथ समेकन को रोकने के लिए एक और चंक।C
को मुक्त करें (0x20 Tcache मुक्त-सूची में डाला गया)।चंक
A
का उपयोगB
पर ओवरफ्लो करने के लिए करें।B
केsize
फ़ील्ड को 0x21 से 0x41 में संशोधित करने के लिए ऑफ-बाई-वन का दुरुपयोग करें।अब हमारे पास
B
में मुक्त चंकC
हैB
को मुक्त करें और एक 0x40 चंक आवंटित करें (यह यहाँ फिर से रखा जाएगा)हम
C
केfd
पॉइंटर को संशोधित कर सकते हैं, जो अब भी मुक्त है (Tcache poisoning)
ऑफ-बाई-नल हमला
मेमोरी के 3 चंक (a, b, c) एक के बाद एक आरक्षित किए जाते हैं। फिर मध्य वाला छोड़ दिया जाता है। पहला एक ऑफ बाई वन ओवरफ्लो वंशवाद होता है और हमलवार इसे 0x00 के साथ दुरुपयोग करता है (यदि पिछला बाइट 0x10 था तो मध्य चंक को इससे 0x10 छोटा बताएगा)।
फिर, मध्य मुक्त चंक (b) में 2 और छोटे चंक आवंटित किए जाते हैं (b1), हालांकि,
b + b->size
कभी भी c चंक को अपडेट नहीं करता क्योंकि पॉइंट किया गया पता इससे छोटा है जितना होना चाहिए।फिर, b1 और c मुक्त हो जाते हैं। क्योंकि
c - c->prev_size
अब भी b (अब b1) को पॉइंट करता है, इन दोनों को एक चंक में समेकित किया जाता है। हालांकि, b2 अब भी b1 और c के बीच में है।अंततः, एक नया मैलोक किया जाता है जिससे इस मेमोरी क्षेत्र को पुनः प्राप्त किया जाता है जिसमें वास्तव में b2 होगा, जो नए मैलोक के मालिक को b2 की सामग्री को नियंत्रित करने की अनुमति देता है।
यह छवि हमला पूरी तरह से समझाती है:
अन्य उदाहरण और संदर्भ
strlen
के कारण ऑफ-बाई-वन होने के कारण अब एक निर्दिष्ट लेखन तकनीक काम करती है।Tcache का उपयोग किया जा रहा है, इसलिए सामान्य ऑफ-बाई-वन हमले काम करते हैं ताकि Tcache poisoning के साथ एक अर्बिट्रे राइट प्राइमिटिव प्राप्त किया जा सके।
एक ऑफ-बाई-वन का दुरुपयोग करना संभव है ताकि हीप से एक पता लीक हो सके क्योंकि अगले चंक का
size
फ़ील्ड 0x00 द्वारा अधिलिखित हो जाता है।अर्बिट्रे राइट इसलिए प्राप्त किया जाता है क्योंकि ऑफ-बाई-वन लेखन का दुरुपयोग किया जाता है ताकि पॉइंटर किसी अन्य स्थान पर पॉइंट करने के लिए एक झूठा संरचना बनाई जा सके। फिर, इस संरचना के पॉइंटर का पालन करने के लिए संदर्भ लिया जा सकता है ताकि अर्बिट्रे राइट प्राप्त किया जा सके।
लिब्स पता लीक होता है क्योंकि यदि हीप को mmap का उपयोग करके विस्तारित किया जाता है, तो mmap द्वारा आवंटित मेमोरी का लिब्स से एक स्थिर ऑफसेट होता है।
अंततः, अर्बिट्रे राइट का दुरुपयोग __free_hook के पते में लिखने के लिए किया जाता है एक वन गैजेट के साथ।
getline
फ़ंक्शन में एक नल ऑफ-बाई-वन वंशवाद है जो उपयोगकर्ता इनपुट लाइनें पढ़ता है। यह फ़ंक्शन सामग्री की "कुंजी" पढ़ने के लिए उपयोग किया जाता है और सामग्री नहीं।हैकिंग ट्रिक्स साझा करें PR जमा करके HackTricks और HackTricks Cloud github रेपो में।
Last updated