
أداة بناء سلسلة ROP تلقائية تستخرج وتحلل الأدوات الصغيرة (gadgets) من الملفات الثنائية باستخدام استعلامات دلالية، وتدعم معماريات X86/X64 مع واجهة برمجة تطبيقات Python وواجهة سطر الأوامر.

ROPium (سابقًا ROPGenerator) هي مكتبة/أداة تُسهّل استغلال ROP. تقوم تلقائيًا باستخراج وتحليل الـ gadgets من الملفات الثنائية وتتيح لك العثور على سلاسل ROP باستخدام استعلامات دلالية. يدعم ROPium بنيتي X86 و X64، وسيتم تمديده قريبًا ليشمل ARM.
الميزات الرئيسية:
rax=rbx+8، [rdi+0x20]=rax، rsi=[rbx+16]، 0x08040212(1, 2, rax)، [0xdeadbeaf] = "/bin/sh\x00"، sys_execve(0xdeadbeef, 0, 0)، sys_0x1(0)، ...أولاً، قم بتثبيت إطار العمل Capstone لفك التجميع:
sudo apt-get install libcapstone-dev
تحتاج أيضًا إلى أحدث إصدار من ROPgadget:
git clone https://github.com/JonathanSalwan/ROPgadget && cd ROPgadget
python setup.py install --user
لاستخدام أداة CLI، قم بتثبيت prompt_toolkit:
pip3 install prompt_toolkit
أخيرًا، قم بتثبيت ROPium:
git clone https://github.com/Boyan-MILANOV/ropium && cd ropium
make
make test
sudo make install
بفضل الغلاف التفاعلي لواجهة الأوامر، يمكنك استخدام ROPium بشكل تفاعلي لبناء سلاسل ROP بسرعة:
هل تحتاج إلى دمج سلاسل ROP مباشرة في نصوصك البرمجية؟ أخبار سارة، ROPium لديه واجهة API بلغة بايثون!
تحميل ملف ثنائي والعثور على سلاسل ROP:
from ropium import *
rop = ROPium(ARCH.X64)
rop.load('/lib/x86_64-linux-gnu/libc-2.27.so')
chain = rop.compile('rbx = [rax + 0x20]')
تصدير سلسلة ROP بتنسيقات مختلفة:
>>> print( chain.dump() )
0x000000000009a851 (sub rax, 0x10; ret)
0x0000000000130018 (mov rax, qword ptr [rax + 0x30]; ret)
0x0000000000052240 (push rax; pop rbx; ret)
>>> print(chain.dump('python'))
from struct import pack
off = 0x0
p = ''
p += pack('<Q', 0x000000000009a851+off) # sub rax, 0x10; ret
p += pack('<Q', 0x0000000000130018+off) # mov rax, qword ptr [rax + 0x30]; ret
p += pack('<Q', 0x0000000000052240+off) # push rax; pop rbx; ret
>>> print(chain.dump('raw'))
b'Q\xa8\t\x00\x00\x00\x00\x00\x18\x00\x13\x00\x00\x00\x00\x00@"\x05\x00\x00\x00\x00\x00'
تعيين قيود على سلاسل ROP:
# البايتات التي يجب ألا تظهر في سلسلة ROP
rop.bad_bytes = [0x00, 0x0a, 0x0b]
# المسجلات التي يجب ألا يتم تغييرها بواسطة سلسلة ROP
rop.keep_regs = ['rsi', 'rdx']
# تمكين/منع سلسلة ROP من إلغاء الإشارة إلى مسجلات قد تحتوي على عناوين غير صالحة
# وضع الأمان هو 'True' افتراضيًا
rop.safe_mem = False
# تحديد ABI الذي تريد استخدامه عند استدعاء الدوال
rop.abi = ABI.X86_CDECL
# تحديد النظام المستهدف عند إجراء استدعاءات النظام
rop.os = OS.LINUX
إذا لزم الأمر، يمكنك تشغيل ROPium في حاوية دوكر. يمكن إنشاء الحاوية من ملف Dockerfile كما يلي:
# إنشاء صورة دوكر الخاصة بك (سيستغرق هذا وقتًا!)
docker build . --tag ropium
# تشغيل الصورة في الوضع التفاعلي، مع ربط الملف المراد تحليله
docker run --rm -it -v /FULL/HOST/PATH/FILE:/tmp/FILE:ro ropium
(ropium)> load -a X86 /tmp/FILE
تبلغ مساحة الصورة الفعلية حوالي 200 ميغابايت، وهي مبنية على Debian Stretch مع تثبيت Python 3.7.3.
Boyan MILANOV - boyan.milanov (at) hotmail (dot) fr
ROPium مُرخَّص بموجب ترخيص MIT.
المساهمون:
يستخدم ROPium المشاريع الرائعة التالية: