2009-03-20 17 views
19

ढेर ओवरफ्लो हमले कैसे किए जाते हैं?ढेर अतिप्रवाह हमले

stackoverflow हमलों के मामले में, हमलावर ने अपने संबोधन के साथ समारोह वापसी पता बदल देता है।

यह ढेर अतिप्रवाह हमलों में कैसे किया जाता है? साथ ही, ढेर से कोड चलाने के लिए संभव है?

उत्तर

32

नोट इस मंच से भिन्न होता है, और मेरे उदाहरण बहुत ज्यादा सरल है। यह मूल रूप से लिंक किए गए सूचियों वाले ढेर प्रबंधकों के लिए आता है जो ओवरराउन हो सकते हैं, और आप प्रक्रिया की स्मृति के यादृच्छिक हिस्सों को ओवरराइट करने के लिए लिंक किए गए सूची पॉइंटर्स का उपयोग कर सकते हैं।

कल्पना कीजिए मैं एक अनुभवहीन ढेर कार्यान्वयन जिसका नियंत्रण ब्लॉक इस तरह हैं:

struct HeapBlockHeader 
{ 
    HeapBlockHeader* next; 
    HeapBlockHeader* prev; 
    int size; 

    // Actual heap buffer follows this structure. 
}; 

जब ढेर मुक्त कर दिया जाता है, इस पर नियंत्रण ब्लॉक मुक्त कर दिया ब्लॉकों की सूची में वापस चला जाता है, अगले/पिछला सूचक को संशोधित करके । यदि मैं एक हीप बफर को ओवरराउन करता हूं, तो मैं डेटा नियंत्रण के साथ अगले नियंत्रण ब्लॉक में पॉइंटर्स को ओवरराइट कर सकता हूं। मान लीजिए कि मैं कोड के पॉइंटर को इंगित करने के लिए इन लिंक को ओवरराइड करता हूं (शायद बस बफर I overran में) और स्टैक पर फ़ंक्शन के रिटर्न पते पर। जब ढेर प्रबंधक ब्लॉक को वापस एक मुक्त सूची में जोड़ने का प्रयास करता है, तो यह वास्तव में स्टैक पर रिटर्न पते को कोड I नियंत्रण में पॉइंटर के साथ ओवरराइट कर देगा। http://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf

संपादित करें: http://www.h-online.com/security/features/A-Heap-of-Risk-747161.html

यह लेख सख्त कि Vista के ढेर प्रबंधक में चला गया हमले की इस तरह रोकने के लिए कुछ सुविधाओं का वर्णन:

यह लेख ढेर अतिप्रवाह हमलों पर एक अच्छा सिंहावलोकन है पर ढेर से कोड चलाने की संभावना, हाँ यह संभव है। कई प्लेटफॉर्म अब डिफ़ॉल्ट रूप से हीप मेमोरी को गैर निष्पादन योग्य बनाते हैं जो रन करने के लिए मनमाने ढंग से कोड प्राप्त करने में बाधा उत्पन्न करता है। हालांकि, अगर आप अभी भी एक "कूद libc करने के लिए" शैली के हमले कर सकते हैं - एक ज्ञात समारोह जो निष्पादन योग्य हो जाएगा करने के लिए वापसी पता ओवरराइट करें।

+0

महान जवाब - मुझे लगता है मैं प्रोग्रामिंग की मेरी विशेष क्षेत्रों के बारे में बहुत जानते हैं कि, लेकिन मैं कभी नहीं compilers, स्मृति प्रबंधन, सुरक्षा तंत्रों में गोता कर लिया है - यह जानकर जहां प्रोसेसर की responsibities बंद करो और ओएस शुरू। फिर फिर ओएस और ऐप कोड के बीच। मैं इंटेल x86 पुस्तिका (खंड 1) कवर करने के लिए कवर पढ़ा है। आप इन चीजों को सीखने के लिए कैसे आए? –

संबंधित मुद्दे