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