
rhabdomancer v0.10.0
مساعد أبحاث الثغرات الأمنية الذي يحدد مواقع استدعاءات دوال API التي قد تكون غير آمنة في ملف ثنائي.
rhabdomancer
"الطريق إلى الثغرات القابلة للاستغلال مفروش بالثغرات غير القابلة للاستغلال."
-- Mark Dowd
Rhabdomancer هي إضافة IDA سريعة للغاية تعمل بدون واجهة رسومية (headless) وتحدد مواقع استدعاءات دوال API التي قد تكون غير آمنة في ملف ثنائي. يمكن للمدققين تتبع الأثر عكسيًا من هذه النقاط المرشحة للعثور على المسارات التي تسمح بالوصول إلى مدخلات غير موثوقة.

الميزات
- تجربة استخدام سريعة للغاية وبدون واجهة رسومية بفضل IDA 9.x وارتباطات Rust الخاصة بـ idalib-rs.
- دعم الأهداف الثنائية المكتوبة بلغة C/C++ والمُجمَّعة لأي معمارية تدعمها IDA.
- تُطبع مواقع استدعاءات دوال API السيئة إلى stdout وتُعلَّم في IDB.
- مواقع الاستدعاء في كود المكتبات التي يتعرف عليها IDA (مثل وقت تشغيل مرتبط ساكنًا ومطابق لتوقيعات FLIRT) تُوسم بـ
(lib). - الاستدعاءات عبر الـ stubs (مثل مدخلات
.pltفي الملفات الثنائية ELF أو stubs الاستيراد في الملفات الثنائية PE وMach-O، والمدرجة كـ thunks) تُتبَّع عكسيًا إلى مستدعيها. - في الملفات الثنائية ELF، تُدرج الدالة عمدًا مرتين مع نفس مواقع الاستدعاء: مرة كـ stub الخاص بها في
.plt(موسوم كـ thunk) ومرة كاستيراد لها. يُعلَّم كل موقع استدعاء مرة واحدة فقط في IDB.
- مواقع الاستدعاء في كود المكتبات التي يتعرف عليها IDA (مثل وقت تشغيل مرتبط ساكنًا ومطابق لتوقيعات FLIRT) تُوسم بـ
- تُجمَّع دوال API السيئة المعروفة في مستويات من السوء للمساعدة في ترتيب أولويات عمل التدقيق.
- [BAD 0] أولوية عالية - الدوال التي تُعتبر عمومًا غير آمنة.
- [BAD 1] أولوية متوسطة - دوال مثيرة للاهتمام ينبغي فحصها بحثًا عن حالات استخدام غير آمنة.
- [BAD 2] أولوية منخفضة - ينبغي فحص مسارات الكود التي تتضمن هذه الدوال بعناية.
- قائمة دوال API السيئة المعروفة مدمجة ويمكن تخصيصها بسهولة عبر ملف إعدادات مبني على
conf/rhabdomancer.toml. - تُطابَق أسماء الدوال دون هذه الزخارف: النقاط والشرطات السفلية البادئة (مثل
_strcpy)، وبادئات أسماء المكتبات المستعارة (مثل__o_mallocفي Universal CRT، و__libc_systemو__GI___snprintfفي glibc)، و، بالنسبة للـ stubs وهذه الأسماء المستعارة فقط، اللاحقة الرقمية التي يضيفها IDA إلى الأسماء المستخدمة بالفعل (مثلmemset_0).
[!NOTE] الدوال المحصَّنة (مثل
__strcpy_chk، المستخدمة بدلًا منstrcpyعند البناء باستخدام_FORTIFY_SOURCE) لا تُطابَق عمدًا، لأنها النسخ المفحوصة من الدوال المدرجة. لتحديد استدعاءاتها أيضًا، أضفها صراحةً إلى إعدادات مخصصة (مثل"__strcpy_chk"بنفس أولويةstrcpy).
المقالات
- https://hex-rays.com/blog/streamlining-vulnerability-research-idalib-rust-bindings
- https://hnsecurity.it/blog/streamlining-vulnerability-research-with-ida-pro-and-rust
انظر أيضًا
- https://github.com/0xdea/ghidra-scripts/blob/main/Rhabdomancer.java
- https://docs.hex-rays.com/release-notes/9_0#headless-processing-with-idalib
- https://github.com/idalib-rs/idalib
- https://books.google.it/books/about/The_Art_of_Software_Security_Assessment.html
التثبيت
أسهل طريقة للحصول على أحدث إصدار هي عبر crates.io:
- نزّل IDA وثبّتها واضبط إعداداتها (انظر https://hex-rays.com/ida-pro).
- ثبّت LLVM/Clang (انظر https://rust-lang.github.io/rust-bindgen/requirements.html).
- على Linux/macOS، ثبّتها كما يلي:
على Windows، بدلاً من ذلك، استخدم الأوامر التالية:export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo install rhabdomancer --locked$env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo install rhabdomancer --locked
الترجمة البرمجية
بدلاً من ذلك، يمكنك البناء من المصدر:
- قم بتنزيل IDA وتثبيته وتكوينه (انظر https://hex-rays.com/ida-pro).
- قم بتثبيت LLVM/Clang (انظر https://rust-lang.github.io/rust-bindgen/requirements.html).
- على Linux/macOS، قم بالترجمة البرمجية على النحو التالي:
على Windows، بدلاً من ذلك، استخدم الأوامر التالية:git clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer export IDADIR=/path/to/ida # if not set, the build script will check common locations cargo build --release --lockedgit clone --depth 1 https://github.com/0xdea/rhabdomancer cd rhabdomancer $env:LIBCLANG_PATH="\path\to\clang+llvm\bin" $env:PATH="\path\to\ida;$env:PATH" $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations cargo build --release --locked
الاستخدام
- تأكد من أن IDA مُهيأ بشكل صحيح مع ترخيص صالح.
- اختياريًا، خصّص قائمة دوال API السيئة المعروفة: انسخ
conf/rhabdomancer.toml(اختر الوسم الذي يطابق نسختك المثبّتة للحصول على قائمته المدمجة الدقيقة)، وحرّر النسخة، واضبط متغير البيئةRHABDOMANCER_CONFIGعلى مساره. يجب أن يعرّف الملف المصفوفاتhighوmediumوlow، دون أي مفاتيح أخرى. وإلا، تُستخدم القائمة المدمجة، وهي مضمّنة في الملف الثنائي وقت البناء منconf/rhabdomancer.toml(تحرير ذلك الملف يتطلب إعادة البناء). - تأكد من ضبط متغير البيئة
IDADIRإذا كان تثبيت IDA لديك في موقع غير قياسي. - شغّله كما يلي:
سيتم تحديث أي ملف IDB rhabdomancer <binary_file>.i64موجود؛ وإلا، سيتم إنشاء ملف IDB جديد. - افتح ملف IDB
.i64الناتج باستخدام IDA. - اختر
View>Open subviews>Bookmarks - استمتع بنتائجك مجموعةً بشكل ملائم في نافذة IDA.
[!NOTE] يضيف Rhabdomancer أيضًا تعليقات عند مواقع الاستدعاء المحددة. يتم وسم كل من الإشارات المرجعية والتعليقات بـ
[BAD n] <function_name>، حيثnهو مستوى الأولوية (0 = عالٍ، 1 = متوسط، 2 = منخفض)، حتى تتمكن السكربتات من البحث عنها في قواعد بيانات IDB. هذا التنسيق مستقر عبر الإصدارات.
التوافق
يُدعم رسميًا أحدث إصدار من IDA فقط، لكن الإصدارات الأقدم قد تعمل أيضًا. يلخص الجدول التالي أحدث إصدار متوافق مع كل إصدار من IDA:
| إصدار IDA | أحدث إصدار متوافق |
|---|---|
| v9.0.240925 | v0.2.4 |
| v9.0.241217 | v0.3.5 |
| v9.1.250226 | v0.6.2 |
| v9.2.250908 | v0.7.6 |
| v9.3.260213 | v0.8.1 |
| v9.3.260327 | v0.9.0 |
| v9.3.260421 | v0.9.3 |
| v9.4.260714 | الإصدار الحالي |
| v9.4.260915 | الإصدار الحالي |
[!NOTE] راجع وثائق idalib-rs للحصول على معلومات إضافية.
الشكر والتقدير
حظي تطوير هذا المشروع بدعم المنظمات التالية:
- HN Security
- Hex-Rays عبر برنامج المساهمين الخاص بها