Heap Overflow
मूलभूत जानकारी
हीप ओवरफ्लो एक स्टैक ओवरफ्लो की तरह है लेकिन हीप में। मुख्य रूप से इसका मतलब है कि हीप में कुछ स्थान आरक्षित किया गया था ताकि कुछ डेटा स्टोर किया जा सके और स्टोर किया गया डेटा आरक्षित स्थान से अधिक था।
स्टैक ओवरफ्लो में हम जानते हैं कि कुछ रजिस्टर जैसे निर्देशिका पॉइंटर या स्टैक फ्रेम स्टैक से पुनर्स्थापित होंगे और इसे उपयोग किया जा सकता है। हीप ओवरफ्लो के मामले में, हीप चंक में कोई संवेदनशील जानकारी डिफ़ॉल्ट रूप से स्टोर नहीं की गई है जो ओवरफ्लो किया जा सकता है। हालांकि, यह संवेदनशील जानकारी या पॉइंटर हो सकता है, इसलिए इस सुरक्षा दोष की महत्वाकांक्षा इस बात पर निर्भर करती है कि किस डेटा को ओवरराइट किया जा सकता है और एक हमलावार कैसे इसका दुरुपयोग कर सकता है।
ओवरफ्लो ऑफसेट्स खोजने के लिए आप स्टैक ओवरफ्लो में उपयोग किए गए पैटर्न का उपयोग कर सकते हैं।
स्टैक ओवरफ्लो बनाम हीप ओवरफ्लो
स्टैक ओवरफ्लो में व्यवस्थित और डेटा जो स्टैक में मौजूद होने वाला है उसका विश्वसनीय होना संभावनात: यह इसलिए है क्योंकि स्टैक लीनियर है, हमेशा बढ़ती हुई है कॉलाइडिंग मेमोरी में, प्रोग्राम चलने के कुछ विशिष्ट स्थानों पर स्टैक मेमोरी आम तौर पर समान प्रकार के डेटा को स्टोर करती है और इसमें हर फंक्शन द्वारा उपयोग किए जाने वाले स्टैक हिस्से के अंत में कुछ विशिष्ट संरचना होती है।
हालांकि, हीप ओवरफ्लो के मामले में, उपयुक्त मेमोरी लीनियर नहीं है लेकिन आवंटित चंक्स आम तौर पर मेमोरी के अलग-अलग स्थानों में होते हैं (एक के बाद दूसरे के पास नहीं) क्योंकि बिन्स और जोन्स आकार द्वारा आवंटन को अलग करते हैं और क्योंकि पिछले मुक्त मेमोरी का उपयोग करते हैं नए चंक्स का आवंटन करने से पहले। यह कठिन है कि वह वस्तु कौन है जो ओवरफ्लो होने वाली वस्तु के साथ टकरा रही है। इसलिए, जब एक हीप ओवरफ्लो पाया जाता है, इसे आवश्यकता होती है कि एक विश्वसनीय तरीका पाया जाए जिससे वांछित वस्तु को मेमोरी में अगले होने के लिए बनाया जा सके जिससे ओवरफ्लो हो सकता है।
इसके लिए उपयोग की जाने वाली तकनीकों में से एक हीप ग्रूमिंग है जिसका उपयोग उदाहरण के लिए इस पोस्ट में किया जाता है। पोस्ट में बताया गया है कि जब iOS कर्नल में किसी जोन को मेमोरी स्टोर करने के लिए मेमोरी की कमी होती है, तो इसे एक कर्नल पेज द्वारा विस्तारित किया जाता है, और इस पेज को उम्मीद की गई आकारों के चंक्स में विभाजित किया जाता है जो क्रम में उपयोग किए जाएंगे (iOS संस्करण 9.2 तक, फिर इन चंक्स का उपयोग इन हमलों के दुरुपयोग को कठिन बनाने के लिए एक यादृच्छिक तरीके से किया जाता है)।
इसलिए, पिछले पोस्ट में जहां एक हीप ओवरफ्लो हो रहा है, ओवरफ्लो होने वाली वस्तु को एक पीड़ित क्रम से टकराने के लिए कई kallocs
को कई धागों द्वारा मजबूर किया जाता है ताकि सभी मुक्त चंक्स भरे जाएं और एक नया पेज बनाया जाए।
इस विशेष आकार के वस्तु से इस भराई को मजबूत करने के लिए, एक iOS मश पोर्ट से संबंधित आउट-ऑफ-लाइन आवंटन एक आदर्श उम्मीदवार है। संदेश के आकार को बनाकर, kalloc
आवंटन का आकार सटीक रूप से निर्धारित किया जा सकता है और जब संबंधित मश पोर्ट नष्ट होता है, तो संबंधित आवंटन तुरंत kfree
में वापस जाएगा।
फिर, कुछ इन प्लेसहोल्डर्स को मुक्त किया जा सकता है। kalloc.4096
फ्री सूची तत्काल पिछले-में-पहले क्रम में तत्काल रिहाई देती है, जिसका मतलब है कि यदि कुछ स्थान पक्षी गए हैं और उत्पादन को कई पीड़ित वस्तुओं को आवंटित करने के लिए कोशिश करते हैं जब ओवरफ्लो होने वाली वस्तु को आवंटित करने की कोशिश करते हैं, तो यह संभावना है कि यह वस्तु एक पीड़ित वस्तु द्वारा अनुसरण की जाएगी।
उदाहरण libc
इस पृष्ठ में एक मौलिक हीप ओवरफ्लो अनुकरण मिल सकता है जो दिखाता है कि अगले चंक के पिछले में उपयोग बिट को ओवरराइट करके और पिछले आकार की स्थिति को कहाँ पर ओवरराइट करके एक उपयोग किया गया चंक समेट सकते हैं (यह अनउसेड महसूस कराने के लिए) और फिर इसे फिर से आवंटित कर सकते हैं जिससे एक अलग पॉइंटर में उपयोग किए जा रहे डेटा को ओवरराइट किया जा सकता है।
[**प्रोट
अन्य उदाहरण
हम एक इंटीजर ओवरफ्लो वल्नरेबिलिटी का उपयोग करते हैं ताकि हम हीप ओवरफ्लो प्राप्त कर सकें।
हम ओवरफ्लोव्ड चंक के एक
struct
के अंदर एक फ़ंक्शन के पॉइंटर को करप्ट करते हैं ताकि हमsystem
जैसे फ़ंक्शन को सेट कर सकें और कोड एक्झीक्यूशन प्राप्त कर सकें।
Last updated