Ret2win
Basic Information
Ret2win चुनौतियाँ Capture The Flag (CTF) प्रतियोगिताओं में एक लोकप्रिय श्रेणी हैं, विशेष रूप से उन कार्यों में जो binary exploitation से संबंधित हैं। लक्ष्य एक दिए गए बाइनरी में एक कमजोरियों का लाभ उठाना है ताकि बाइनरी के भीतर एक विशिष्ट, अनावृत्त कार्य को निष्पादित किया जा सके, जिसे अक्सर win
, flag
, आदि जैसे नाम से जाना जाता है। जब इस कार्य को निष्पादित किया जाता है, तो यह आमतौर पर एक ध्वज या सफलता संदेश प्रिंट करता है। चुनौती आमतौर पर स्टैक पर return address को ओवरराइट करने में शामिल होती है ताकि निष्पादन प्रवाह को इच्छित कार्य की ओर मोड़ा जा सके। यहाँ एक अधिक विस्तृत व्याख्या है उदाहरणों के साथ:
C Example
एक साधारण C प्रोग्राम पर विचार करें जिसमें एक कमजोरी और एक win
कार्य है जिसे हम कॉल करने का इरादा रखते हैं:
इस प्रोग्राम को स्टैक सुरक्षा के बिना और ASLR को अक्षम करके संकलित करने के लिए, आप निम्नलिखित कमांड का उपयोग कर सकते हैं:
-m32
: प्रोग्राम को 32-बिट बाइनरी के रूप में संकलित करें (यह वैकल्पिक है लेकिन CTF चुनौतियों में सामान्य है)।-fno-stack-protector
: स्टैक ओवरफ्लो के खिलाफ सुरक्षा को निष्क्रिय करें।-z execstack
: स्टैक पर कोड के निष्पादन की अनुमति दें।-no-pie
: पोजीशन इंडिपेंडेंट एक्सीक्यूटेबल को निष्क्रिय करें ताकिwin
फ़ंक्शन का पता न बदले।-o vulnerable
: आउटपुट फ़ाइल का नामvulnerable
रखें।
Python Exploit using Pwntools
एक्सप्लॉइट के लिए, हम pwntools का उपयोग करेंगे, जो एक्सप्लॉइट लिखने के लिए एक शक्तिशाली CTF ढांचा है। एक्सप्लॉइट स्क्रिप्ट एक पेलोड बनाएगी जो बफर को ओवरफ्लो करेगी और रिटर्न पते को win
फ़ंक्शन के पते से ओवरराइट करेगी।
win
फ़ंक्शन का पता लगाने के लिए, आप gdb, objdump, या किसी अन्य उपकरण का उपयोग कर सकते हैं जो आपको बाइनरी फ़ाइलों का निरीक्षण करने की अनुमति देता है। उदाहरण के लिए, objdump
के साथ, आप उपयोग कर सकते हैं:
यह कमांड आपको win
फ़ंक्शन का असेंबली दिखाएगा, जिसमें इसका प्रारंभिक पता शामिल है।
Python स्क्रिप्ट एक सावधानीपूर्वक तैयार किया गया संदेश भेजती है जो, जब vulnerable_function
द्वारा संसाधित किया जाता है, तो बफर को ओवरफ्लो करता है और स्टैक पर रिटर्न पते को win
के पते से ओवरराइट करता है। जब vulnerable_function
लौटता है, तो यह main
पर लौटने या बाहर निकलने के बजाय win
पर कूदता है, और संदेश प्रिंट होता है।
सुरक्षा
PIE को बंद किया जाना चाहिए ताकि पता निष्पादन के दौरान विश्वसनीय हो या जिस पते पर फ़ंक्शन संग्रहीत होगा वह हमेशा एक जैसा नहीं होगा और आपको यह पता लगाने के लिए कुछ लीक की आवश्यकता होगी कि
win
फ़ंक्शन कहाँ लोड हुआ है। कुछ मामलों में, जब ओवरफ्लो का कारण बनने वाला फ़ंक्शनread
या समान है, तो आप रिटर्न पते कोwin
फ़ंक्शन में बदलने के लिए 1 या 2 बाइट का आंशिक ओवरराइट कर सकते हैं। ASLR के काम करने के तरीके के कारण, अंतिम तीन हेक्स निबल यादृच्छिक नहीं होते हैं, इसलिए सही रिटर्न पते को प्राप्त करने का 1/16 मौका (1 निबल) होता है।स्टैक कैनरीज़ को भी बंद किया जाना चाहिए या समझौता किया गया EIP रिटर्न पता कभी नहीं होगा।
अन्य उदाहरण और संदर्भ
32 बिट, कोई ASLR नहीं
64 बिट ASLR के साथ, बिन पते का लीक
64 बिट, कोई ASLR नहीं
32 बिट, कोई ASLR नहीं, डबल स्मॉल ओवरफ्लो, पहले स्टैक को ओवरफ्लो करना और दूसरे ओवरफ्लो के आकार को बढ़ाना
32 बिट, relro, कोई कैनरी नहीं, nx, कोई pie नहीं,
fflush
के पते कोwin
फ़ंक्शन (ret2win) के साथ ओवरराइट करने के लिए फॉर्मेट स्ट्रिंग32 बिट, nx, कुछ और नहीं,
win
फ़ंक्शन को कॉल करने के लिए EIP का आंशिक ओवरराइट (1Byte)32 बिट, nx, कुछ और नहीं,
win
फ़ंक्शन को कॉल करने के लिए EIP का आंशिक ओवरराइट (1Byte)प्रोग्राम केवल एक संख्या के अंतिम बाइट को इनपुट के आकार की जांच के लिए मान्य कर रहा है, इसलिए यह संभव है कि अंतिम बाइट अनुमत सीमा के भीतर हो। फिर, इनपुट एक बफर ओवरफ्लो बनाता है जिसे ret2win के साथ शोषण किया जाता है।
64 बिट, relro, कोई कैनरी नहीं, nx, pie।
win
फ़ंक्शन (ret2win) को कॉल करने के लिए आंशिक ओवरराइटarm64, PIE, यह एक PIE लीक देता है
win
फ़ंक्शन वास्तव में 2 फ़ंक्शन हैं इसलिए ROP गैजेट जो 2 फ़ंक्शन को कॉल करता हैARM64, एक
win
फ़ंक्शन को कॉल करने के लिए ऑफ-बाय-वन
ARM64 उदाहरण
Ret2win - arm64Last updated