2009-01-20 12 views
19

buffer overflows कैसे कंप्यूटर का उपयोग करने के लिए उपयोग किया जाता है?कंप्यूटर का शोषण करने के लिए बफर ओवरफ़्लो का उपयोग कैसे किया जाता है?

stack या heap ओवरफ्लो के कारण आसानी से मनमाने ढंग से कोड निष्पादित करने में सक्षम कैसे है?

मैं समझता हूं कि प्रोग्राम मेमोरी के भाग ओवरराइट किए गए हैं, जिन्हें नहीं माना जाता है, लेकिन मुझे नहीं लगता कि यह कैसे अपने कोड को निष्पादित करता है। साथ ही, क्या तीसरे पक्ष के दुर्भावनापूर्ण कोड को लक्षित प्रोसेसर असेंबली भाषा में लिखा जाना चाहिए?

+0

@ कोडी ब्रोकियस, संपादन के लिए धन्यवाद। –

उत्तर

16

इस विषय पर सबसे व्यापक रूप से जाना जाता दस्तावेज है: Smashing the Stack for Fun and Profit

हालांकि, 'ढेर अतिप्रवाह' बफर अतिप्रवाह के साथ कुछ नहीं किया है। स्टैक ओवरफ़्लो आमतौर पर खराब कोड में एक त्रुटि केस होता है जिसका उपयोग किसी दुर्घटना (डीओएस) के बाहर किसी भी चीज़ के लिए नहीं किया जा सकता है।

संपादित करें: आपने ढेर के प्रवाह के बारे में भी पूछा। यह विषय पर एक अच्छा दस्तावेज है: http://www.w00w00.org/files/articles/heaptut.txt

+3

ध्यान दें कि ढेर ओवरफ्लो भी शोषक हो सकते हैं (उदाहरण के लिए स्टैक पर एक रिटर्न पता ओवरराइट करके)। उदाहरण देखें http://stackoverflow.com/questions/286090/stack-overflow-exploit-in-c – sleske

+0

स्टैक ओवरफ़्लो बिल्कुल शोषक हैं। विंडोज 2000/प्रारंभिक एक्सपी युग में सभी शोषण का विशाल बहुमत स्टैक-ओवरफ्लो था, और आईई 6 में स्टैक ओवरफ्लो के कारण कई पैच किए गए शोषण हैं। – SecurityMatt

8

स्टैक में डेटा और वापसी पता होता है जब आप एक सबराउटिन में कूदते हैं। यदि आप स्टैक पर एक विशिष्ट पता डालते हैं जहां रिटर्न पता है, तो आप सीपीयू को किसी विशेष मेमोरी लोकेशन पर कूदने के लिए मजबूर कर सकते हैं, जहां एक कहां अपना कोड डालता है। यह बफर ओवरफ्लो के लिए है। हीप ओवरफ्लो थोड़ा अलग और शोषण करना मुश्किल है।

स्टैक ओवरफ़्लो केवल संकेत हैं कि आप स्टैक स्पेस से बाहर हो गए हैं (जो आमतौर पर अधिक सीमित है, विशेष रूप से कर्नेल में)।

+0

आवेदन के पता स्थान में मनमाने ढंग से कोड कैसे लोड किया जाएगा? अगर मुझे अपनी मशीन आर्किटेक्चर कक्षाएं याद आती हैं तो सीपीयू को इस तरह के सुरक्षा मुद्दों से बचने के लिए डेटा सेगमेंट में कुछ भी निष्पादित नहीं करने के लिए डिज़ाइन किया गया है। – Cybis

+0

वास्तव में यह सुनिश्चित करने के लिए ऑपरेटिंग सिस्टम का काम है कि डेटा निष्पादित नहीं किया गया है, और ऐसी भेद्यताएं हो सकती हैं जिनका शोषण किया जा सकता है। या आप प्रोग्राम के मूल कोड को चला सकते हैं, लेकिन गलत अनुक्रम में, शायद इसे एक अनंत लूप में फंस गया है, इसलिए यह वह काम नहीं कर सकता है जिसे वह माना जाता है। – Artelius

1

सामान्य दृष्टिकोण यह है कि आपके पास स्मृति में दुर्भावनापूर्ण कोड है। फिर आप एक बफर ओवरफ़्लो बनाते हैं: यहां का जादू इसे अतिप्रवाह नहीं बनाना है, लेकिन जैसा कि आपने पहले ही उल्लेख किया है, प्रोग्राम मेमोरी के कुछ हिस्सों को अधिलेखित किया जाता है। चूंकि ढेर में न केवल चर होते हैं, बल्कि जब किसी फ़ंक्शन को रिटर्न पता कहा जाता है, तो कोई भी आपके दुर्भावनापूर्ण कोड के पते के साथ इसे ओवरराइट करने का प्रयास करता है। जब बफर ओवरफ़्लो के साथ फ़ंक्शन अपने कॉलर पर वापस आता है, तो फ़ंक्शन अपने मूल कॉलर पर वापस नहीं आता है बल्कि दुर्भावनापूर्ण सबराउटिन के लिए। चूंकि अब निष्पादित कोड को औपचारिक रूप से कॉलिंग कोड के विशेषाधिकार हैं, एक कोड में इस अतिप्रवाह को खोजने/बनाने का प्रयास करता है जिसमें बुरा कोड की तुलना में अधिक अनुमति होती है (अन्यथा आप सीधे बुराई दिनचर्या को कॉल करके कर सकते हैं)।

5

सबराउटिन को कॉल करते समय वस्तुतः सभी आधुनिक प्रोसेसर स्थानीय डेटा (स्टैक) के समान क्षेत्र पर वापसी पते को धक्का देते हैं। दिनचर्या के लिए जो एक चर की ऊपरी सीमा (विशेष रूप से strcpy फ़ंक्शन) की जांच नहीं करता है, निर्देश पता पुनर्निर्देशन (बफर ओवरफ़्लो) हो सकता है।

void make(char *me) 
{ 
    char sandwich[4]; // local data, this is in stack. the buffer for data is too small 
    strcpy(sandwich, me); 
    puts(sandwich); 

    // implicit "return;" the return instruction(RET on Intel) instructs the processor to implicitly pop an address from stack then resume execution on that address 
} 

void main() 
{ 
    // calling a subroutine (CALL on Intel) implicitly instructs the processor to push the next instruction's address(getchar line) on stack before jumping to make. 
    make("Love Not War"); 
    getchar(); 

    puts("This will not execute. The address to next instruction(getchar) gets overwritten with Not War"); 

} 

"साथ ही, तीसरे पक्ष के दुर्भावनापूर्ण कोड को लक्षित प्रोसेसर असेंबली भाषा में लिखा जाना चाहिए?" हां

स्टैक ओवरफ़्लो सामान्य रूप से चल रहे प्रोग्राम से हो सकता है, उदाहरण अनदेखी अवधि के साथ रिकर्सिव रूटीन (फ़ंक्शन जो स्वयं कॉल करता है) होता है। स्टैक क्षेत्र स्टैक प्लस रिटर्निंग पतों पर कई स्थानीय चर से भरा होगा।

7

सड़क पर दो घरों की कल्पना करो। एक तुम्हारा दोस्त का घर है और एक उसका बुरा पागल पड़ोसी पड़ोसी का घर तीन दरवाजे नीचे है। दुष्ट पागल पड़ोसी पड़ोसी कभी प्रवेश या पत्तियां नहीं लेता है, और उसकी जगह तंग हो जाती है।

अब, आपका मित्र इतना भरोसेमंद दोस्त है, वह आपको एक जगह से एक दूसरे के बाद एक बॉक्स को नीचे रखकर, अपने स्थान पर कुछ भी स्टोर करने देगा। असल में, वह इतना अच्छा दोस्त है कि वह दूसरे के बाद एक बॉक्स को नीचे रखेगा, यह देखने के बिना कि क्या वह दीवार पर मारा गया है, जब तक कि वे मिडयर में नहीं जाते और आखिर में सड़क पर दो अन्य घरों के माध्यम से दाएं बुराई पागल पड़ोसी पड़ोसी का घर। लेकिन आपका मित्र भरोसा करता है कि आप ऐसा नहीं करेंगे क्योंकि वह आपको पसंद करता है (और वह थोड़ा सा मूर्ख है)।

तो आपके पास अपने अच्छे भरोसेमंद दोस्त का शोषण करके बुराई पागल पड़ोसी के घर में कुछ डालने का अवसर है।


निम्नलिखित नियम बदलें और आप एक बफर अतिप्रवाह हमला करने के लिए सादृश्य देखेंगे:

  • "अपने दोस्त के घर" -> "एक प्रोग्राम है जो जांच नहीं की जाती के एक हिस्से को बफर ओवरफ्लो "
  • " उसका बुरा पागल पड़ोसी पड़ोसी का घर "->" एक प्रोग्राम का एक और हिस्सा जो सुरक्षित होना चाहिए "
  • " बॉक्स "->" कार्यक्रम के लिए तर्क/पैरामीटर जो जांच नहीं करता है बफर ओवरफ्लो के लिए "

यह केवल तभी सफल होता है जब कोई व्यक्ति यह पता लगाता है कि स्मृति का सुरक्षित क्षेत्र कहां है, और प्रश्न में प्रोग्राम के लिए तर्क के रूप में क्या पारित किया जाना है, जो सुरक्षित क्षेत्र में वांछित प्रभाव के लिए समाप्त हो जाएगा । (चाहे वह डेटा है, या कोड जो शोषक के कोड को निष्पादित करने का कारण बनता है)

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