Ret2esp / Ret2reg
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)
क्योंकि ESP (स्टैक पॉइंटर) हमेशा स्टैक के शीर्ष की ओर इशारा करता है, यह तकनीक EIP (इंस्ट्रक्शन पॉइंटर) को jmp esp
या call esp
इंस्ट्रक्शन के पते से बदलने में शामिल है। ऐसा करने से, शेलकोड ठीक उस स्थान पर रखा जाता है जहाँ EIP को ओवरराइट किया गया है। जब ret
इंस्ट्रक्शन निष्पादित होता है, तो ESP अगले पते की ओर इशारा करता है, जो ठीक उसी स्थान पर है जहाँ शेलकोड संग्रहीत है।
यदि एड्रेस स्पेस लेआउट रैंडमाइजेशन (ASLR) विंडोज़ या लिनक्स में सक्षम नहीं है, तो साझा लाइब्रेरी में पाए गए jmp esp
या call esp
इंस्ट्रक्शनों का उपयोग करना संभव है। हालाँकि, ASLR सक्रिय होने पर, किसी को इन इंस्ट्रक्शनों के लिए कमजोर प्रोग्राम के भीतर देखना पड़ सकता है (और आपको PIE को हराने की आवश्यकता हो सकती है)।
इसके अलावा, EIP भ्रष्टाचार के बाद शेलकोड को रखने में सक्षम होना, स्टैक के मध्य में नहीं, यह सुनिश्चित करता है कि फ़ंक्शन के संचालन के दौरान निष्पादित किसी भी push
या pop
इंस्ट्रक्शनों का शेलकोड के साथ हस्तक्षेप नहीं होता है। यदि शेलकोड फ़ंक्शन के स्टैक के मध्य में रखा गया होता, तो यह हस्तक्षेप हो सकता था।
यदि आप RIP को ओवरराइट करने के बाद लिखने के लिए स्थान की कमी महसूस कर रहे हैं (शायद केवल कुछ बाइट्स), तो एक प्रारंभिक jmp
शेलकोड लिखें जैसे:
और स्टैक में जल्दी शेलकोड लिखें।
आप इस तकनीक का एक उदाहरण https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp पर अंतिम एक्सप्लॉइट के साथ पा सकते हैं:
आप इस तकनीक का एक और उदाहरण देख सकते हैं https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html। यहाँ एक बफर ओवरफ्लो है जिसमें NX सक्षम नहीं है, इसका उपयोग एक गैजेट करने के लिए किया गया है $esp
के पते को कम करने के लिए और फिर एक jmp esp;
का उपयोग करके शेलकोड पर कूदने के लिए:
इसी तरह, यदि हम जानते हैं कि एक फ़ंक्शन उस पते को लौटाता है जहाँ शेलकोड संग्रहीत है, तो हम call eax
या jmp eax
निर्देशों का उपयोग कर सकते हैं (जिसे ret2eax तकनीक के रूप में जाना जाता है), जो हमारे शेलकोड को निष्पादित करने का एक और तरीका प्रदान करता है। जैसे eax, कोई अन्य रजिस्टर जिसमें एक दिलचस्प पता हो, का उपयोग किया जा सकता है (ret2reg).
आप यहाँ कुछ उदाहरण पा सकते हैं:
strcpy
eax
में उस बफर का पता संग्रहीत करेगा जहाँ शेलकोड संग्रहीत था और eax
को अधिलेखित नहीं किया जा रहा है, इसलिए ret2eax
का उपयोग करना संभव है।
ARM64 में कोई निर्देश नहीं हैं जो SP रजिस्टर पर कूदने की अनुमति देते हैं। यह संभव हो सकता है कि एक गैजेट मिले जो sp को एक रजिस्टर में स्थानांतरित करता है और फिर उस रजिस्टर पर कूदता है, लेकिन मेरी काली की libc में मुझे ऐसा कोई गैजेट नहीं मिला:
मैंने केवल वही खोजा जो उस रजिस्ट्रि के मान को बदल देगा जहाँ sp को कूदने से पहले कॉपी किया गया था (इसलिए यह बेकार हो जाएगा):
यदि एक रजिस्ट्रि का एक दिलचस्प पता है, तो इसे कूदने के लिए केवल उचित निर्देश खोजकर कूदना संभव है। आप कुछ ऐसा उपयोग कर सकते हैं:
ARM64 में, यह x0
है जो एक फ़ंक्शन का लौटने वाला मान संग्रहीत करता है, इसलिए यह हो सकता है कि x0 एक बफर का पता संग्रहीत करता है जिसे उपयोगकर्ता द्वारा नियंत्रित किया जाता है जिसमें निष्पादित करने के लिए एक शेलकोड होता है।
Example code:
फंक्शन के डिसअसेंबली की जांच करने पर यह देखा जा सकता है कि बफर का पता (bof के लिए संवेदनशील और उपयोगकर्ता द्वारा नियंत्रित) x0
में संग्रहीत है बफर ओवरफ्लो से लौटने से पहले:
यह भी संभव है कि do_stuff
फंक्शन में गैजेट br x0
पाया जाए:
हम उस गैजेट का उपयोग करेंगे ताकि हम इसमें कूद सकें क्योंकि बाइनरी बिना PIE के संकलित है। एक पैटर्न का उपयोग करके यह देखा जा सकता है कि बफर ओवरफ्लो का ऑफसेट 80 है, इसलिए एक्सप्लॉइट होगा:
यदि fgets
के बजाय कुछ ऐसा read
का उपयोग किया गया होता, तो केवल रिटर्न पते के अंतिम 2 बाइट्स को ओवरराइट करके br x0;
निर्देश पर लौटना संभव होता बिना पूरे पते को जाने।
fgets
के साथ यह काम नहीं करता क्योंकि यह अंत में एक नल (0x00) बाइट जोड़ता है।
NX: यदि स्टैक निष्पादन योग्य नहीं है तो यह मदद नहीं करेगा क्योंकि हमें शेलकोड को स्टैक में रखना है और इसे निष्पादित करने के लिए कूदना है।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)