SROP - Sigreturn-Oriented Programming
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)
Sigreturn
एक विशेष syscall है जिसका मुख्य उपयोग एक सिग्नल हैंडलर के निष्पादन के बाद सफाई करने के लिए किया जाता है। सिग्नल वे व्यवधान हैं जो ऑपरेटिंग सिस्टम द्वारा एक प्रोग्राम को भेजे जाते हैं, अक्सर यह संकेत देने के लिए कि कोई असाधारण स्थिति उत्पन्न हुई है। जब एक प्रोग्राम एक सिग्नल प्राप्त करता है, तो यह सिग्नल को संभालने के लिए अस्थायी रूप से अपने वर्तमान कार्य को रोक देता है, एक सिग्नल हैंडलर के साथ, जो सिग्नल को संभालने के लिए डिज़ाइन किया गया एक विशेष फ़ंक्शन है।
सिग्नल हैंडलर के समाप्त होने के बाद, प्रोग्राम को अपने पिछले स्थिति पर लौटने की आवश्यकता होती है जैसे कि कुछ भी नहीं हुआ। यहीं पर sigreturn
काम आता है। यह प्रोग्राम को सिग्नल हैंडलर से लौटने में मदद करता है और प्रोग्राम की स्थिति को बहाल करता है, सिग्नल हैंडलर द्वारा उपयोग किए गए स्टैक फ्रेम (मेमोरी का वह भाग जो फ़ंक्शन कॉल और स्थानीय चर को संग्रहीत करता है) को साफ करके।
दिलचस्प बात यह है कि sigreturn
प्रोग्राम की स्थिति को कैसे बहाल करता है: यह CPU के सभी रजिस्टर मानों को स्टैक पर संग्रहीत करके ऐसा करता है। जब सिग्नल अब अवरुद्ध नहीं होता है, sigreturn
इन मानों को स्टैक से पॉप करता है, प्रभावी रूप से CPU के रजिस्टर को उनके उस स्थिति में रीसेट करता है जब सिग्नल को संभाला गया था। इसमें स्टैक पॉइंटर रजिस्टर (RSP) शामिल है, जो स्टैक के वर्तमान शीर्ष की ओर इशारा करता है।
ROP श्रृंखला से sigreturn
syscall को कॉल करना और रजिस्ट्रियों के मानों को जोड़ना जो हम इसे स्टैक में लोड करना चाहते हैं, यह संभव बनाता है कि हम सभी रजिस्टर मानों को नियंत्रित कर सकें और इसलिए कॉल कर सकें, उदाहरण के लिए, syscall execve
के साथ /bin/sh
।
ध्यान दें कि यह एक प्रकार का Ret2syscall होगा जो अन्य Ret2syscalls को कॉल करने के लिए पैरामीटर को नियंत्रित करना बहुत आसान बनाता है:
Ret2syscallयदि आप जिज्ञासु हैं, तो यह sigcontext संरचना है जो स्टैक में संग्रहीत होती है ताकि बाद में मानों को पुनर्प्राप्त किया जा सके (चित्र यहां से):
For a better explanation check also:
आप यहाँ एक उदाहरण पा सकते हैं जहाँ सिगनरटर्न के लिए कॉल ROP के माध्यम से बनाई गई है (rxa में मान 0xf
डालकर), हालाँकि यह वहाँ से अंतिम एक्सप्लॉइट है:
Check also the exploit from here जहाँ बाइनरी पहले से ही sigreturn
को कॉल कर रहा था और इसलिए इसे ROP के साथ बनाने की आवश्यकता नहीं है:
असेंबली बाइनरी जो स्टैक पर लिखने की अनुमति देती है और फिर sigreturn
syscall को कॉल करती है। स्टैक पर एक ret2syscall को sigreturn संरचना के माध्यम से लिखना संभव है और बाइनरी की मेमोरी के अंदर जो फ्लैग है उसे पढ़ना संभव है।
असेंबली बाइनरी जो स्टैक पर लिखने की अनुमति देती है और फिर sigreturn
syscall को कॉल करती है। स्टैक पर एक ret2syscall को sigreturn संरचना के माध्यम से लिखना संभव है (बाइनरी में स्ट्रिंग /bin/sh
है)।
64 बिट्स, कोई relro नहीं, कोई canary नहीं, nx, कोई pie नहीं। gets
फ़ंक्शन का उपयोग करते हुए सरल बफर ओवरफ्लो जो ret2syscall को निष्पादित करता है। ROP श्रृंखला /bin/sh
को .bss
में लिखती है gets
को फिर से कॉल करके, यह alarm
फ़ंक्शन का दुरुपयोग करती है ताकि eax को 0xf
पर सेट किया जा सके ताकि एक SROP को कॉल किया जा सके और एक शेल निष्पादित किया जा सके।
64 बिट्स असेंबली प्रोग्राम, कोई relro नहीं, कोई canary नहीं, nx, कोई pie नहीं। प्रवाह स्टैक में लिखने, कई रजिस्टरों को नियंत्रित करने, और एक syscall को कॉल करने की अनुमति देता है और फिर यह exit
को कॉल करता है। चयनित syscall एक sigreturn
है जो रजिस्टर सेट करेगा और eip
को एक पूर्व syscall निर्देश को कॉल करने के लिए स्थानांतरित करेगा और बाइनरी स्पेस को rwx
पर सेट करने के लिए memprotect
को चलाएगा और बाइनरी स्पेस में ESP को सेट करेगा। प्रवाह का पालन करते हुए, प्रोग्राम फिर से ESP में पढ़ने को कॉल करेगा, लेकिन इस मामले में ESP अगली निर्देश की ओर इशारा करेगा इसलिए एक शेलकोड पास करना इसे अगली निर्देश के रूप में लिखेगा और इसे निष्पादित करेगा।
SROP का उपयोग उस स्थान को निष्पादन विशेषाधिकार (memprotect) देने के लिए किया जाता है जहाँ एक शेलकोड रखा गया था।
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)