- क्या आप किसी **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी **कंपनी को HackTricks में विज्ञापित** देखना चाहते हैं? या क्या आपको **PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड** करने की अनुमति चाहिए? [**सदस्यता योजनाएं**](https://github.com/sponsors/carlospolop) की जांच करें!
2.`POP_RDI`, `PUTS_PLT` और `MAIN_PLT` गैजेट्स ढूंढें
3. पिछले गैजेट का उपयोग करके puts या किसी अन्य libc फ़ंक्शन के मेमोरी पते को **लीक करें** और libc संस्करण का पता लगाएं ([इसे डाउनलोड करें](https://libc.blukat.me))
4. पुस्तकालय के साथ, **ROP की गणना करें और इसे उत्पन्न करें**
यह ट्यूटोरियल इस ट्यूटोरियल में प्रस्तावित कोड/बाइनरी को शोषण करेगा: [https://tasteofsecurity.com/security/ret2libc-unknown-libc/](https://tasteofsecurity.com/security/ret2libc-unknown-libc/)\
और एक उपयोगी ट्यूटोरियल: [https://made0x78.com/bseries-ret2libc/](https://made0x78.com/bseries-ret2libc/), [https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html)
एक्सप्लॉइट के साथ आगे बढ़ने से पहले टेम्पलेट को एक ऑफसेट की आवश्यकता होती है। यदि कोई भी प्रदान किया जाता है तो यह उसे ढूंढ़ने के लिए आवश्यक कोड को निष्पादित करेगा (डिफ़ॉल्ट रूप से `OFFSET = ""`):
**क्रियान्वयित करें** `python template.py` एक GDB कंसोल खुलेगा जिसमें कार्यक्रम क्रैश हो जाएगा। उस GDB कंसोल में `x/wx $rsp` क्रियान्वित करें ताकि RIP को ओवरराइट करने वाले बाइट्स प्राप्त किए जा सकें। अंत में एक **पायथन** कंसोल का उपयोग करके **ऑफसेट** प्राप्त करें:
अब हमें बाइनरी में ROP गैजेट्स खोजने की आवश्यकता है। ये ROP गैजेट्स `puts` को कॉल करने के लिए उपयोगी होंगे ताकि **libc** का पता लगाया जा सके, और बाद में **अंतिम अधिकार** को शुरू करने के लिए।
`PUTS_PLT` को **फ़ंक्शन puts** को कॉल करने के लिए आवश्यक है।\
`MAIN_PLT` को **मुख्य फ़ंक्शन** को फिर से कॉल करने के लिए आवश्यक है, एक इंटरेक्शन के बाद **ओवरफ़्लो का शोध** करने के लिए (असीमित दौरों के अधिग्रहण के लिए)। **यह प्रोग्राम को फिर से कॉल करने के लिए हर ROP के अंत में उपयोग किया जाता है**।\
**POP\_RDI** को **पैरामीटर** को कॉल करने के लिए आवश्यक है।
अब समय है कि हम जांचें कि कौन सी **libc** पुस्तकालय का उपयोग हो रहा है। इसके लिए हमें मेमोरी में **फ़ंक्शन**`puts` के **पते** को **लीक** करने की आवश्यकता होगी और फिर हमें यह जानने की आवश्यकता होगी कि उस पते में puts संस्करण किस पुस्तकालय संस्करण में है।
यह कुछ बाइट भेजेगा जब तक **RIP** को **अधिलेखित** करना संभव हो जाएगा: `OFFSET`।
फिर, यह गैजेट `POP_RDI` का **पता** सेट करेगा ताकि अगला पता (`FUNC_GOT`) **RDI** रजिस्ट्री में सहेजा जा सके। इसका कारण है कि हमें **puts** को **बुलाना है** और इसे **पास** करना है `PUTS_GOT` का **पता** मानकी मेमोरी में पुट्स फंक्शन का पता `PUTS_GOT` द्वारा पता करने वाले पते में सहेजा जाता है।
इसके बाद, `PUTS_PLT` को बुलाया जाएगा (जिसमें **RDI** में `PUTS_GOT` होगा) ताकि पुट्स **`PUTS_GOT`** में अंदर की सामग्री पढ़ सके (**मेमोरी में पुट्स फंक्शन का पता**) और इसे **प्रिंट करेगा**।
अंत में, **मुख्य फ़ंक्शन को फिर से बुलाया जाता है** ताकि हम फिर से ओवरफ़्लो का उपयोग कर सकें।
इस तरीके से हमने **पुट्स फंक्शन को धोखा दिया** है कि वह **मेमोरी में पुट्स** फ़ंक्शन का **पता प्रिंट करेगा** (जो **लिब्सी** पुस्तकालय में है)। अब जब हमारे पास उस पते का हो गया है, हम **खोज सकते हैं कि कौन सी लिब्सी संस्करण का उपयोग हो रहा है**।
हम कुछ **स्थानिक** बाइनरी का **उपयोग कर रहे हैं** इसलिए यह **आवश्यक नहीं** है कि हम जानें कि कौन सी **लिब्सी** संस्करण का उपयोग हो रहा है (बस `/lib/x86_64-linux-gnu/libc.so.6` में पुस्तकालय ढूंढें)।
लेकिन, दूरस्थ उत्पीड़न मामले में मैं यहां बताऊंगा कि आप इसे कैसे ढूंढ सकते हैं:
इस बिंदु पर हमें लिबीसी पुस्तकालय का उपयोग किया जाना चाहिए। जैसा कि हम एक स्थानीय बाइनरी का उपयोग कर रहे हैं, मैं केवल इसका उपयोग करूंगा: `/lib/x86_64-linux-gnu/libc.so.6`
अंतिम ROP (`rop1`) में हम फिर से मुख्य फ़ंक्शन को कॉल कर रहे थे, फिर हम **ओवरफ़्लो** का फिर से **उपयोग कर सकते हैं** (इसीलिए `OFFSET` यहां फिर से है)। फिर, हम `POP_RDI` को **पॉइंट करना चाहते हैं**_"/bin/sh"_ के **पते** (`BINSH`) और **सिस्टम** फ़ंक्शन (`SYSTEM`) को कॉल करना चाहते हैं क्योंकि _"/bin/sh"_ का पता पैरामीटर के रूप में पास किया जाएगा।
अंत में, **एक्ज़िट फ़ंक्शन का पता****कॉल किया जाता है** ताकि प्रक्रिया **अच्छी तरह से समाप्त हो** और कोई चेतावनी उत्पन्न नहीं होती है।
आप [**ONE\_GADGET** ](https://github.com/david942j/one\_gadget) का उपयोग करके **सिस्टम** और **"/bin/sh"** का उपयोग करने के बजाय एक शेल प्राप्त करने के लिए भी उपयोग कर सकते हैं। **ONE\_GADGET** लिबीसी पुस्तकालय के अंदर से एक **ROP पता** का उपयोग करके एक शेल प्राप्त करने का कोई तरीका खोजेगा।
हालांकि, आमतौर पर कुछ प्रतिबंध होते हैं, सबसे सामान्य और आसानी से टालने योग्य वे ऐसे होते हैं जैसे `[rsp+0x30] == NULL` जैसे कि आप **RSP** के अंदर के मान को नियंत्रित करते हैं आपको बस कुछ अधिक NULL मान भेजना होगा ताकि प्रतिबंध को टाला जा सके।
- क्या आप किसी **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी **कंपनी को HackTricks में विज्ञापित** देखना चाहते हैं? या क्या आपको **PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग** करना चाहिए? [**सदस्यता योजनाएं**](https://github.com/sponsors/carlospolop) की जांच करें!
- **शामिल हों** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) में या मुझे **Twitter** पर **फ़ॉलो** करें [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**