ROP - Return Oriented Programing
Last updated
Last updated
AWS हैकिंग सीखें और प्रैक्टिस करें:HackTricks प्रशिक्षण AWS रेड टीम एक्सपर्ट (ARTE) GCP हैकिंग सीखें और प्रैक्टिस करें: HackTricks प्रशिक्षण GCP रेड टीम एक्सपर्ट (GRTE)
रिटर्न-ओरिएंटेड प्रोग्रामिंग (ROP) एक उन्नत शोषण तकनीक है जिसका उपयोग No-Execute (NX) या डेटा एक्जीक्यूशन प्रिवेंशन (DEP) जैसी सुरक्षा उपायों को टालने के लिए किया जाता है। शेलकोड इंजेक्शन और निष्पादन की बजाय, एक हमलावर बाइनरी या लोडेड लाइब्रेरी में पहले से मौजूद कोड के टुकड़ों का उपयोग करता है, जिन्हें "गैजेट्स" कहा जाता है। प्रत्येक गैजेट सामान्यत: ret
निर्देश के साथ समाप्त होता है और एक छोटे से ऑपरेशन का निष्पादन करता है, जैसे कि रजिस्टर के बीच डेटा को ले जाना या अंकगणितीय ऑपरेशन करना। इन गैजेट्स को एक साथ जोड़कर, एक हमलावर एक पेलोड बना सकता है जिससे वे विभिन्न ऑपरेशन कर सकते हैं, NX/DEP सुरक्षा की रक्षा को पार करते हुए।
नियंत्रण फ्लो हाइजैकिंग: पहले, एक हमलावर को किसी प्रोग्राम के नियंत्रण फ्लो को हाइजैक करने की आवश्यकता होती है, सामान्यत: एक बफर ओवरफ्लो का उपयोग करके स्टैक पर सहेजी गई वापसी पता को अधिक करने के लिए।
गैजेट चेनिंग: फिर हमलावर ध्यानपूर्वक गैजेट्स का चयन करता है और चेनिंग करता है ताकि वह वांछित क्रियाएँ कर सके। इसमें किसी फ़ंक्शन के लिए तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से तार्किक तरीके से
यूनिक्स-जैसे सिस्टम पर System V AMD64 ABI कॉलिंग कनवेंशन का उपयोग करता है, जहां पहले छह पूर्णांक या पॉइंटर आर्ग्यूमेंट को रजिस्टर RDI
, RSI
, RDX
, RCX
, R8
, और R9
में पारित किया जाता है। अतिरिक्त आर्ग्यूमेंट स्टैक पर पारित किए जाते हैं। रिटर्न मान RAX
में रखा जाता है।
Windows x64 कॉलिंग कनवेंशन में पहले चार पूर्णांक या पॉइंटर आर्ग्यूमेंट के लिए RCX
, RDX
, R8
, और R9
का उपयोग किया जाता है, अतिरिक्त आर्ग्यूमेंट स्टैक पर पारित किए जाते हैं। रिटर्न मान RAX
में रखा जाता है।
रजिस्टर: 64-बिट रजिस्टर में RAX
, RBX
, RCX
, RDX
, RSI
, RDI
, RBP
, RSP
, और R8
से R15
शामिल हैं।
हमारे उद्देश्य के लिए, चलो हमें उन गैजेट्स पर ध्यान केंद्रित करें जो हमें RDI रजिस्टर सेट करने की अनुमति देंगे (system() को आर्ग्यूमेंट के रूप में "/bin/sh" स्ट्रिंग पास करने के लिए) और फिर system() फ़ंक्शन को कॉल करेंगे। हम मान लेंगे कि हमने निम्नलिखित गैजेट्स की पहचान कर ली है:
pop rdi; ret: स्टैक के शीर्ष मान को RDI में पॉप करता है और फिर वापस लौटता है। system() के लिए हमारे आर्ग्यूमेंट सेट करने के लिए आवश्यक है।
ret: कुछ स्थितियों में स्टैक संरेखण के लिए उपयोगी एक सरल रिटर्न।
और हम system() फ़ंक्शन का पता जानते हैं।
नीचे एक उदाहरण है जिसमें pwntools का उपयोग करके x64 पर system('/bin/sh') को निष्पादित करने के लिए आरओपी श्रृंखला सेट अप और निष्पादित करने के लिए किया गया है:
x86-64 ABI सुनिश्चित करता है कि कॉल इंस्ट्रक्शन को निष्पादित करते समय स्टैक 16-बाइट एलाइन्ड हो। LIBC, प्रदर्शन को अनुकूलित करने के लिए SSE इंस्ट्रक्शन (जैसे movaps) का उपयोग करता है जो इस एलाइनमेंट की आवश्यकता है। यदि स्टैक सही ढंग से एलाइन नहीं है (यानी RSP 16 का गुणक नहीं है), तो ROP चेन में system जैसे फ़ंक्शन को कॉल करने में विफलता होगी। इसे ठीक करने के लिए, आपके ROP चेन में system को कॉल करने से पहले एक ret गैजेट जोड़ें।
क्योंकि x64 पहले कुछ तर्क के लिए रजिस्टर्स का उपयोग करता है, इसे साधारण फ़ंक्शन कॉल के लिए x86 की तुलना में कम गैजेट्स की आवश्यकता होती है, लेकिन सही गैजेट्स का पता लगाना और उन्हें चेन करना अधिक जटिल हो सकता है क्योंकि रजिस्टर्स की बढ़ी हुई संख्या और बड़े पते का अंतर्वस्तु अंतर्वस्तु के लिए अवसर और चुनौतियाँ प्रदान करते हैं। x64 आर्किटेक्चर में बढ़ी हुई रजिस्टर्स की संख्या और बड़े पते का अंतर्वस्तु अंतर्वस्तु विकसित करने के लिए अवसर और चुनौतियाँ प्रदान करते हैं, विशेष रूप से Return-Oriented Programming (ROP) के संदर्भ में।