Ret2win
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ret2win चुनौतियाँ Capture The Flag (CTF) प्रतियोगिताओं में एक लोकप्रिय श्रेणी हैं, विशेष रूप से उन कार्यों में जो बाइनरी शोषण से संबंधित हैं। लक्ष्य एक दिए गए बाइनरी में एक कमजोरियों का शोषण करना है ताकि बाइनरी के भीतर एक विशिष्ट, अनावृत्त कार्य को निष्पादित किया जा सके, जिसे अक्सर win
, flag
, आदि जैसे नाम से जाना जाता है। जब इस कार्य को निष्पादित किया जाता है, तो यह आमतौर पर एक ध्वज या सफलता संदेश प्रिंट करता है। चुनौती आमतौर पर स्टैक पर रिटर्न पता को ओवरराइट करने में शामिल होती है ताकि निष्पादन प्रवाह को इच्छित कार्य की ओर मोड़ा जा सके। यहाँ एक अधिक विस्तृत व्याख्या है उदाहरणों के साथ:
एक साधारण C प्रोग्राम पर विचार करें जिसमें एक कमजोरी और एक win
कार्य है जिसे हम कॉल करने का इरादा रखते हैं:
इस प्रोग्राम को स्टैक सुरक्षा के बिना और ASLR को अक्षम करके संकलित करने के लिए, आप निम्नलिखित कमांड का उपयोग कर सकते हैं:
-m32
: प्रोग्राम को 32-बिट बाइनरी के रूप में संकलित करें (यह वैकल्पिक है लेकिन CTF चुनौतियों में सामान्य है)।
-fno-stack-protector
: स्टैक ओवरफ्लो के खिलाफ सुरक्षा को निष्क्रिय करें।
-z execstack
: स्टैक पर कोड के निष्पादन की अनुमति दें।
-no-pie
: पोजीशन इंडिपेंडेंट एक्सीक्यूटेबल को निष्क्रिय करें ताकि win
फ़ंक्शन का पता न बदले।
-o vulnerable
: आउटपुट फ़ाइल का नाम vulnerable
रखें।
एक्सप्लॉइट के लिए, हम 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 रिटर्न पता कभी नहीं होगा।
32bit, कोई ASLR नहीं
64 बिट्स ASLR के साथ, बिन पते का लीक
64 बिट्स, कोई ASLR नहीं
32 बिट्स, कोई ASLR नहीं, डबल स्मॉल ओवरफ्लो, पहले स्टैक को ओवरफ्लो करना और दूसरे ओवरफ्लो के आकार को बढ़ाना
32 बिट, relro, कोई कैनरी नहीं, nx, कोई pie नहीं, फ़ॉर्मेट स्ट्रिंग fflush
के पते को win
फ़ंक्शन (ret2win) के साथ ओवरराइट करने के लिए
32 बिट, nx, कुछ और नहीं, EIP का आंशिक ओवरराइट (1Byte) win
फ़ंक्शन को कॉल करने के लिए
32 बिट, nx, कुछ और नहीं, EIP का आंशिक ओवरराइट (1Byte) win
फ़ंक्शन को कॉल करने के लिए
प्रोग्राम केवल एक संख्या के अंतिम बाइट को इनपुट के आकार की जांच के लिए मान्य कर रहा है, इसलिए यह संभव है कि अंतिम बाइट अनुमत सीमा के भीतर हो। फिर, इनपुट एक बफर ओवरफ्लो बनाता है जिसे ret2win
के साथ शोषण किया जाता है।
64 बिट, relro, कोई कैनरी नहीं, nx, pie। win
फ़ंक्शन (ret2win) को कॉल करने के लिए आंशिक ओवरराइट
arm64, PIE, यह एक PIE लीक देता है win
फ़ंक्शन वास्तव में 2 फ़ंक्शन हैं इसलिए ROP गैजेट जो 2 फ़ंक्शन को कॉल करता है
ARM64, एक win
फ़ंक्शन को कॉल करने के लिए ऑफ-बाय-वन
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)