
مكتشف ROP Gadget سريع جدًا™ ومتعدد الخيوط. بديل لـ ropper / ropgadget (x86 فقط حاليًا)
ropr هي أداة بحث سريعة جدًا متعددة الخيوط عن أدوات ROP.
أدوات ROP (البرمجة الموجهة بالعودة) هي مقاطع صغيرة من بضع تعليمات تجميعية تنتهي عادةً بتعليمة ret، وهي موجودة بالفعل ككود قابل للتنفيذ داخل كل ملف ثنائي أو مكتبة. يمكن استخدام هذه الأدوات في استغلال الثنائيات وتخريب البرامج القابلة للتنفيذ.
عند كتابة عناوين العديد من أدوات ROP في مخزن مؤقت، نحصل على سلسلة ROP. إذا تمكن المهاجم من تحريك مؤشر المكدس إلى هذه السلسلة، فيمكن نقل التحكم بالكامل إلى المهاجم.
تحتوي معظم البرامج القابلة للتنفيذ على عدد كافٍ من الأدوات لكتابة سلسلة ROP كاملة تورنغ. بالنسبة لتلك التي لا تحتوي، يمكن دائمًا استخدام المكتبات الديناميكية الموجودة في نفس مساحة العنوان مثل libc بمجرد معرفة عناوينها.
جمال استخدام أدوات ROP هو أنه لا حاجة لكتابة أي كود جديد قابل للتنفيذ في أي مكان - يمكن للمهاجم تحقيق هدفه باستخدام الكود الموجود بالفعل في البرنامج فقط.
عادةً، الشرط الأول لاستخدام أدوات ROP هو الحصول على مكان لكتابة سلسلة ROP الخاصة بك - يمكن أن يكون أي مخزن مؤقت قابل للقراءة. اكتب ببساطة عناوين كل أداة تريد استخدامها في هذا المخزن المؤقت. إذا كان المخزن المؤقت صغيرًا جدًا، فقد لا يكون هناك مساحة كافية لكتابة سلسلة ROP طويلة، لذا يجب على المهاجم أن يكون حريصًا على صياغة سلسلة ROP الخاصة به لتكون فعالة بما يكفي لتناسب المساحة المتاحة.
الشرط التالي هو القدرة على التحكم في المكدس - يمكن أن يأخذ ذلك شكل تجاوز سعة المكدس - مما يسمح بكتابة سلسلة ROP مباشرة تحت مؤشر المكدس، أو "تدوير المكدس" - وهو عادةً أداة واحدة تحرك مؤشر المكدس إلى بقية سلسلة ROP.
بمجرد أن يكون مؤشر المكدس في بداية سلسلة ROP الخاصة بك، ستؤدي تعليمة ret التالية إلى تنفيذ الأدوات بالتسلسل - كل منها يستخدم التالي كعنوان عودة في إطار المكدس الخاص به.
من الممكن أيضًا إضافة مؤشرات دالة إلى سلسلة ROP - مع الحرص على تقديم وسائط الدالة بعد العنصر التالي من سلسلة ROP. عادةً ما يتم دمج ذلك مع "أداة pop"، والتي تقوم بإخراج الوسائط من المكدس من أجل الانتقال بسلاسة إلى الأداة التالية بعد وسائط الدالة.
التثبيت السهل:
cargo install ropr
سيتم تثبيت التطبيق في ~/.cargo/bin
من المصدر:
git clone https://github.com/Ben-Lichtman/ropr
cd ropr
cargo build --release
سيكون الملف الثنائي الناتج في target/release/ropr
بدلاً من ذلك:
git clone https://github.com/Ben-Lichtman/ropr
cd ropr
cargo install --path .
سيتم تثبيت التطبيق في ~/.cargo/bin
USAGE:
ropr [OPTIONS] <BINARY>
ARGS:
<BINARY> مسار الملف المراد فحصه
OPTIONS:
-b, --base-pivot يقوم بتصفية الأدوات التي تغير مؤشر القاعدة
-c, --colour <COLOUR> يفرض إخراج الألوان أو النص العادي (`true` أو `false`)
-h, --help طباعة معلومات المساعدة
-j, --nojop يزيل "أدوات JOP" - قد تحتوي هذه على فرع قابل للتحكم،
استدعاء، إلخ بدلاً من `ret` بسيط في النهاية
-m, --max-instr <MAX_INSTR> الحد الأقصى لعدد التعليمات في الأداة [الافتراضي: 6]
-n, --noisy يتضمن أدوات منخفضة الجودة محتملة مثل البادئات،
الفروع الشرطية، والفروع القريبة (سيعثر على أدوات أكثر بكثير)
-p, --stack-pivot يقوم بتصفية الأدوات التي تغير مؤشر المكدس
-r, --norop يزيل "أدوات ROP" العادية
-R, --regex <REGEX> إجراء بحث بتعبير منتظم على الأدوات التي تم إرجاعها لسهولة التصفية
--range <RANGE> البحث بين نطاقات العناوين (بالسداسي عشري) مثل `0x1234-0x4567`
--raw <RAW> يعامل ملف الإدخال ككتلة من الكود (`true` أو `false`)
-s, --nosys يزيل استدعاءات النظام والمقاطعات الأخرى
-V, --version طباعة معلومات الإصدار
على سبيل المثال إذا كنت أبحث عن طريقة لملء rax بقيمة من سجل آخر، فقد أختار التصفية بواسطة التعبير المنتظم ^mov eax, ...;:
❯ ropr /usr/lib/libc.so.6 -R "^mov eax, ...;" > /dev/null
==> تم العثور على 197 أداة في 0.118 ثانية
الآن يمكنني إضافة بعض عوامل التصفية إلى سطر الأوامر للحصول على أفضل النتائج جودة:
❯ 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;
==> تم العثور على 6 أدوات في 0.046 ثانية
الآن لدي أداة mov جيدة مرشحة في العنوان 0x00052252.