Off by one overflow
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
केवल 1B ओवरफ्लो तक पहुंच होने से एक हमलावर को अगले चंक के size
फ़ील्ड को संशोधित करने की अनुमति मिलती है। यह यह तय करने की अनुमति देता है कि वास्तव में कौन से चंक्स मुक्त हैं, संभावित रूप से एक चंक उत्पन्न करना जो एक अन्य वैध चंक को शामिल करता है। शोषण डबल फ्री या ओवरलैपिंग चंक्स के समान है।
ऑफ बाय वन कमजोरियों के 2 प्रकार हैं:
मनमाना बाइट: यह प्रकार किसी भी मान के साथ उस बाइट को ओवरराइट करने की अनुमति देता है
नल बाइट (ऑफ-बाय-नल): यह प्रकार उस बाइट को केवल 0x00 के साथ ओवरराइट करने की अनुमति देता है
इस कमजोरी का एक सामान्य उदाहरण निम्नलिखित कोड में देखा जा सकता है जहां strlen
और strcpy
का व्यवहार असंगत है, जो अगले चंक की शुरुआत में 0x00 बाइट सेट करने की अनुमति देता है।
इसे हाउस ऑफ आइन्हेरजार के साथ शोषित किया जा सकता है।
यदि 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 विषाक्तता)।
3 मेमोरी चंक्स (a, b, c) एक के बाद एक आरक्षित किए जाते हैं। फिर मध्य वाला मुक्त किया जाता है। पहला एक ऑफ बाय वन ओवरफ्लो भेद्यता को समाहित करता है और हमलावर इसका दुरुपयोग 0x00 के साथ करता है (यदि पिछले बाइट 0x10 था तो यह मध्य चंक को यह संकेत देगा कि यह वास्तव में 0x10 छोटा है)।
फिर, मध्य मुक्त चंक (b) में 2 और छोटे चंक्स आवंटित किए जाते हैं, हालाँकि, चूंकि b + b->size
कभी भी c चंक को अपडेट नहीं करता है क्योंकि पॉइंटेड पता जितना होना चाहिए उससे छोटा है।
फिर, b1 और c मुक्त हो जाते हैं। चूंकि c - c->prev_size
अभी भी b (अब b1) की ओर इशारा करता है, दोनों एक चंक में समेकित होते हैं। हालाँकि, b2 अभी भी b1 और c के बीच में है।
अंततः, एक नया malloc किया जाता है जो इस मेमोरी क्षेत्र को पुनः प्राप्त करता है जो वास्तव में b2 को समाहित करने जा रहा है, जिससे नए malloc के मालिक को b2 की सामग्री को नियंत्रित करने की अनुमति मिलती है।
यह चित्र हमले को पूरी तरह से समझाता है:
strlen
के कारण ऑफ-बाय-वन।
Tcache का उपयोग किया जा रहा है, इसलिए एक सामान्य ऑफ-बाय-वन हमले का उपयोग Tcache विषाक्तता के साथ एक मनमाना लिखने की प्राइमिटिव प्राप्त करने के लिए किया जाता है।
एक ऑफ बाय वन का दुरुपयोग करके हीप से एक पता लीक करना संभव है क्योंकि 0x00 बाइट एक स्ट्रिंग के अंत में अगले फ़ील्ड द्वारा ओवरराइट किया जा रहा है।
मनमाना लिखने को प्राप्त करने के लिए ऑफ बाय वन लिखने का दुरुपयोग किया जाता है ताकि पॉइंटर को एक और स्थान पर इंगित किया जा सके जहाँ एक नकली संरचना के साथ नकली पॉइंटर बनाए जाएंगे। फिर, इस संरचना के पॉइंटर का पालन करके मनमाना लिखना संभव है।
libc पता लीक होता है क्योंकि यदि हीप को mmap का उपयोग करके बढ़ाया जाता है, तो mmap द्वारा आवंटित मेमोरी libc से एक निश्चित ऑफसेट होती है।
अंततः मनमाना लिखने का दुरुपयोग किया जाता है ताकि __free_hook के पते पर एक गेजेट लिखा जा सके।
getline
फ़ंक्शन में एक NULL ऑफ बाय वन भेद्यता है जो उपयोगकर्ता इनपुट पंक्तियों को पढ़ता है। इस फ़ंक्शन का उपयोग सामग्री की "कुंजी" पढ़ने के लिए किया जाता है और सामग्री नहीं।
लेखन में 5 प्रारंभिक चंक्स बनाए जाते हैं:
chunk1 (0x200)
chunk2 (0x50)
chunk5 (0x68)
chunk3 (0x1f8)
chunk4 (0xf0)
शीर्ष चंक के साथ समेकन से बचने के लिए चंक रक्षा (0x400)
फिर चंक 1, 5 और 3 को मुक्त किया जाता है, इसलिए:
[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]
[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]