security register कंप्यूटर का फायदा उठाने के लिए बफर ओवरफ्लोज कैसे उपयोग किया जाता है?




सीपीयू रजिस्टर (4)

कंप्यूटर का फायदा उठाने के लिए बफर ओवरफ्लोज कैसे उपयोग किया जाता है?

कैसे एक या स्ट्रैप या ढेर ओवरफ्लो पैदा करके मनमाना कोड निष्पादित करने में सक्षम है?

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


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

स्टैक ओवरफ्लो सिर्फ संकेत है कि आपने स्टैक स्पेस (जो आम तौर पर अधिक सीमित है, खासकर कर्नेल में) से बाहर चला है।


यह इस विषय पर सबसे व्यापक रूप से ज्ञात दस्तावेज है: मज़ा और लाभ के लिए स्टैक मुंह बनाना

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

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


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

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");

}

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

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


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

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

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

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

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

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





exploit