
एक अत्यंत तेज़™ मल्टीथ्रेडेड ROP गैजेट खोजक। ropper / ropgadget विकल्प (वर्तमान में केवल x86)
ropr एक अत्यंत तेज़ मल्टीथ्रेडेड ROP Gadget खोजकर्ता है।
ROP (Return Oriented Programming) Gadgets कुछ असेंबली निर्देशों के छोटे टुकड़े होते हैं जो आमतौर पर ret निर्देश में समाप्त होते हैं और जो प्रत्येक बाइनरी या लाइब्रेरी में पहले से मौजूद निष्पादन योग्य कोड होते हैं। इन गैजेट्स का उपयोग बाइनरी शोषण और कमजोर निष्पादनयोग्य को उलटने के लिए किया जा सकता है।
जब कई ROP Gadgets के पते एक बफर में लिखे जाते हैं तो हम एक ROP Chain बनाते हैं। यदि कोई हमलावर स्टैक पॉइंटर को इस ROP Chain में ले जा सकता है, तो नियंत्रण पूरी तरह से हमलावर को स्थानांतरित किया जा सकता है।
अधिकांश निष्पादनयोग्य में ट्यूरिंग-पूर्ण ROP Chain लिखने के लिए पर्याप्त गैजेट होते हैं। उनके लिए जिनमें नहीं हैं, कोई हमेशा उसी एड्रेस-स्पेस में स्थित डायनामिक लाइब्रेरीज़ जैसे कि libc का उपयोग कर सकता है, एक बार जब हम उनके पतों को जान लेते हैं।
ROP Gadgets के उपयोग की खूबसूरती यह है कि कहीं भी कोई नया निष्पादन योग्य कोड लिखने की आवश्यकता नहीं है - एक हमलावर केवल प्रोग्राम में पहले से मौजूद कोड का उपयोग करके अपने उद्देश्य को प्राप्त कर सकता है।
आमतौर पर ROP Gadgets का उपयोग करने के लिए पहली आवश्यकता अपनी ROP Chain लिखने के लिए एक स्थान रखना है - यह कोई भी पठनीय बफर हो सकता है। बस उन गैजेट्स के पते जिनका आप उपयोग करना चाहते हैं, इस बफर में लिखें। यदि बफर बहुत छोटा है, तो लंबी ROP Chain लिखने के लिए पर्याप्त जगह नहीं हो सकती है, इसलिए हमलावर को अपनी ROP Chain को कुशल बनाने के लिए सावधानीपूर्वक तैयार करना चाहिए ताकि वह उपलब्ध स्थान में फिट हो सके।
अगली आवश्यकता स्टैक को नियंत्रित करने में सक्षम होना है - यह स्टैक ओवरफ्लो का रूप ले सकता है - जो ROP Chain को सीधे स्टैक पॉइंटर के नीचे लिखने की अनुमति देता है, या एक "stack pivot" - जो आमतौर पर एक एकल गैजेट होता है जो स्टैक पॉइंटर को शेष ROP Chain पर ले जाता है।
एक बार जब स्टैक पॉइंटर आपकी ROP Chain की शुरुआत में होता है, तब अगला ret निर्देश गैजेट्स को अनुक्रम में निष्पादित करने के लिए ट्रिगर करेगा - प्रत्येक अपने स्वयं के स्टैक फ्रेम पर अगले को अपने रिटर्न एड्रेस के रूप में उपयोग करता है।
ROP Chain में फंक्शन पॉइंटर्स जोड़ना भी संभव है - ध्यान रखें कि फंक्शन आर्गुमेंट्स को ROP Chain के अगले तत्व के बाद आपूर्ति की जाए। यह आमतौर पर एक "pop gadget" के साथ जोड़ा जाता है, जो फंक्शन आर्गुमेंट्स के बाद अगले गैजेट पर सुचारू रूप से संक्रमण करने के लिए आर्गुमेंट्स को स्टैक से हटाता है।
Easy install:
cargo install ropr
एप्लिकेशन ~/.cargo/bin में स्थापित होगा।
From source:
git clone https://github.com/Ben-Lichtman/ropr
cd ropr
cargo build --release
परिणामी बाइनरी target/release/ropr में स्थित होगी।
Alternatively:
git clone https://github.com/Ben-Lichtman/ropr
cd ropr
cargo install --path .
एप्लिकेशन ~/.cargo/bin में स्थापित होगा।
USAGE:
ropr [OPTIONS] <BINARY>
ARGS:
<BINARY> The path of the file to inspect
OPTIONS:
-b, --base-pivot Filters for gadgets which alter the base pointer
-c, --colour <COLOUR> Forces output to be in colour or plain text (`true` or `false`)
-h, --help Print help information
-j, --nojop Removes "JOP Gadgets" - these may have a controllable branch,
call, etc. instead of a simple `ret` at the end
-m, --max-instr <MAX_INSTR> Maximum number of instructions in a gadget [default: 6]
-n, --noisy Includes potentially low-quality gadgets such as prefixes,
conditional branches, and near branches (will find significantly
more gadgets)
-p, --stack-pivot Filters for gadgets which alter the stack pointer
-r, --norop Removes normal "ROP Gadgets"
-R, --regex <REGEX> Perform a regex search on the returned gadgets for easy filtering
--range <RANGE> Search between address ranges (in hexadecial) eg. `0x1234-0x4567`
--raw <RAW> Treats the input file as a blob of code (`true` or `false`)
-s, --nosys Removes syscalls and other interrupts
-V, --version Print version information
उदाहरण के लिए, यदि मैं किसी अन्य रजिस्टर से rax को मान से भरने का तरीका ढूंढ रहा था, तो मैं regex ^mov eax, ...; द्वारा फ़िल्टर करना चुन सकता हूं:
❯ ropr /usr/lib/libc.so.6 -R "^mov eax, ...;" > /dev/null
==> Found 197 gadgets in 0.118 seconds
अब मैं सर्वोत्तम गुणवत्ता परिणामों के लिए कमांड लाइन में कुछ फिल्टर जोड़ सकता हूं:
❯ ropr /usr/lib/libc.so.6 -m 2 -j -s -R "^mov eax, ...;"
0x000353e7: mov eax, eax; ret;
0x000788c8: mov eax, ecx; ret;
0x00052252: mov eax, edi; ret;
0x0003ae43: mov eax, edx; ret;
0x000353e6: mov eax, r8d; ret;
0x000788c7: mov eax, r9d; ret;
==> Found 6 gadgets in 0.046 seconds
अब मेरे पास पते 0x00052252 पर एक अच्छा mov गैजेट उम्मीदवार है।