
Windows x86 PoC: पुराने 32-बिट विंडोज पर कस्टम शेलकोड के साथ स्टैक-आधारित बफर ओवरफ्लो
यह 32-बिट विंडोज के लिए स्टैक-आधारित बफर ओवरफ्लो एक्सप्लॉइट्स पर एक सरल, स्व-निहित ट्यूटोरियल है। किसी बाहरी गाइड की आवश्यकता नहीं है—आपको जो कुछ भी चाहिए वह यहाँ है।
vulnerable.c: एक सरल प्रोग्राम जिसमें असुरक्षित gets() फंक्शन है।messageBox.asm: एक छोटा असेंबली पेलोड जो ओवरफ्लो के बाद निष्पादित होगा।exploit.c: एक उदाहरण कि ओवरफ्लो कैसे ट्रिगर किया जा सकता है।यह प्रोजेक्ट एक मुख्य विचार सिखाता है: असुरक्षित इनपुट पढ़ना एक हमलावर को रिटर्न एड्रेस को ओवरराइट करने और निष्पादन को पुनर्निर्देशित करने की अनुमति दे सकता है।
gets() का कोई आकार सीमा नहीं हैvulnerable.c में, प्रोग्राम ऐसा करता है:
char buffer[32];
gets(buffer);
प्रोग्राम buffer के लिए 32 बाइट्स आरक्षित करता है, फिर इनपुट पढ़ने के लिए gets() को कॉल करता है।
समस्या: gets() बफर आकार की जाँच नहीं करता है।
यह तब तक कैरेक्टर पढ़ता रहता है जब तक कि उसे न्यूलाइन न मिल जाए।
यदि उपयोगकर्ता 40 या 50 कैरेक्टर टाइप करता है, तो अतिरिक्त कैरेक्टर 32-बाइट बफर से आगे बह जाते हैं।
जब कोई C फंक्शन चलता है, तो स्टैक (मेमोरी का एक क्षेत्र) संग्रहीत करता है:
buffer)EBP (कॉलिंग फंक्शन का बेस पॉइंटर)इसे इस तरह चित्रित करें:
Lower addresses (top of stack as drawn)
[ buffer (32 bytes) ]
[ saved EBP (4 bytes) ]
[ return address (4 bytes) ]
Higher addresses (bottom)
जब gets() buffer को बहुत अधिक इनपुट से ओवरफ्लो करता है, तो अतिरिक्त बाइट्स सहेजे गए EBP और फिर रिटर्न एड्रेस को ओवरराइट कर देते हैं।
यदि हम ध्यानपूर्वक ओवरफ्लो को इस प्रकार तैयार करें कि रिटर्न एड्रेस फील्ड में एक विशिष्ट पता रखा जाए, तो जब फंक्शन लौटने का प्रयास करेगा तो CPU उस पते पर कूद जाएगा।
buffer[32] आवंटित करता है।gets(buffer) को कॉल करता है।gets() में आकार की जाँच नहीं है, इसलिए यह सभी 50 बाइट्स को बफर में लिखता है।buffer से आगे बह जाते हैं और सहेजे गए EBP और रिटर्न एड्रेस को ओवरराइट कर देते हैं।यह बफर ओवरफ्लो के माध्यम से कोड निष्पादन का सबसे सरल रूप है।
messageBox.asm एक छोटा कोड टुकड़ा है जो ओवरफ्लो के बाद चलने के लिए डिज़ाइन किया गया है।
यह निम्नलिखित करता है:
LoadLibraryA को स्ट्रिंग "USER32.DLL" के साथ कॉल करता है।ExitProcess को कॉल करता है।मुख्य बिंदु: यह निष्पादन योग्य कोड है जो ओवरफ्लो द्वारा निष्पादन को पुनर्निर्देशित करने के बाद चलता है। जब मैसेज बॉक्स स्क्रीन पर दिखाई देता है, तो यह तीन बातें साबित करता है:
एक वास्तविक हमले में, यह पेलोड कुछ भी कर सकता है: डेटा चुराना, उपयोगकर्ता बनाना, मैलवेयर डाउनलोड करना, आदि। मैसेज बॉक्स यह प्रदर्शित करने का एक दृश्यमान, सुरक्षित तरीका है कि मनमाना कोड निष्पादन हुआ।
यह विशिष्ट पेलोड MessageBoxA (0x751D8830) और ExitProcess (0x7437ADB0) के लिए हार्डकोडेड मेमोरी पतों का उपयोग करता है।
ये पते एक सिस्टम के लिए विशिष्ट हैं। पेलोड को किसी भिन्न विंडोज संस्करण या सिस्टम के लिए समायोजित करने की आवश्यकता होगी।

आधुनिक विंडोज में कई सुरक्षा विशेषताएं हैं जो इस एक्सप्लॉइट को रोकती हैं:
इस शिक्षण अभ्यास के लिए, हम उन सभी को अक्षम करते हैं।
विशिष्ट फ्लैग के साथ MSVC (Microsoft Visual C++) का उपयोग करें:
cl /c /GS- /W3 /Zl vulnerable.c
link /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /NXCOMPAT:NO vulnerable.obj /OUT:vulnerable.exe
फ्लैग के अर्थ:
/GS- स्टैक बफर ओवररन सुरक्षा को अक्षम करता है।/DYNAMICBASE:NO एड्रेस स्पेस लेआउट रैंडमाइजेशन (ASLR) को अक्षम करता है।/NXCOMPAT:NO DEP को अक्षम करता है, स्टैक पर कोड को निष्पादित करने की अनुमति देता है।यदि आपके पास पहले से ही एक्जीक्यूटेबल है, तो आप editbin के साथ सुरक्षा अक्षम कर सकते हैं:
editbin /NXCOMPAT:NO /DYNAMICBASE:NO vulnerable.exe
vulnerable.exe शुरू करें।यह README बताता है:
gets() क्या है और यह असुरक्षित क्यों है (कोई आकार सीमा नहीं)।अब आप संपूर्ण बफर ओवरफ्लो एक्सप्लॉइट प्रवाह को समझ गए हैं। अपनी समझ को मजबूत करने के लिए कोड फ़ाइलों को पढ़ें और इस स्पष्टीकरण से तुलना करें।
यह उदाहरण केवल सीखने के लिए है। इस तकनीक का उपयोग उन सिस्टमों के खिलाफ न करें जिनके आप मालिक नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट अनुमति नहीं है। कंप्यूटर सिस्टम तक अनधिकृत पहुंच अवैध है।