
هذا المُختبر التجريبي مخصص لاستخدامه في اختبار API في الذاكرة.
الإصدار 1.4 حقوق النشر (C) 2020 أندريا فيورالدي [email protected]
تم الإصدار بموجب رخصة Apache الإصدار 2.0
تم تصميم هذا الفازر التجريبي لاستخدامه في فازر API داخل الذاكرة.
التصميم مستوحى بشكل كبير ومبني على AFL/AFL++.
ATM المحول بسيط للغاية، فقط مراحل havoc و splice الخاصة بـ AFL.
اختبرت فقط الأمثلة الموجودة تحت tests/، هذا مشروع قيد التطوير ولكن من المعروف أنه يعمل على الأقل على GNU/Linux x86_64 و Android x86_64.
تحتاج إلى Frida >= 12.8.1 لتشغيل هذا (pip3 install -U frida) و frida-tools لتجميع الهارنس.
يجب استيراد مكتبة fuzz في هارنس مخصص ثم تجميعها باستخدام frida-compile لتوليد العامل الذي سيقوم frida-fuzzer بحقنه في التطبيق الهدف.
معظم منطق الفازر موجود في العامل.
الهارنس له التنسيق التالي:
var fuzz = require("./fuzz");
var TARGET_MODULE = "test_linux64";
var TARGET_FUNCTION = DebugSymbol.fromName("target_func").address;;
var RET_TYPE = "void";
var ARGS_TYPES = ['pointer', 'int'];
var func_handle = new NativeFunction(TARGET_FUNCTION, RET_TYPE, ARGS_TYPES, { traps: 'all' });
fuzz.target_module = TARGET_MODULE;
var payload_mem = Memory.alloc(fuzz.config.MAX_FILE);
fuzz.fuzzer_test_one_input = function (/* Uint8Array */ payload) {
Memory.writeByteArray(payload_mem, payload, payload.length);
func_handle(payload_mem, payload.length);
}
fuzz.fuzzer_test_one_input إلزامي. إذا لم تحدد fuzz.target_module، فسيتم تجهيز جميع الأكواد التي يتم تنفيذها.
يمكنك أيضًا تعيين fuzz.manual_loop_start = true لإخبار الفازر بأنك ستستدعي fuzz.fuzzing_loop() في رد اتصال وبالتالي لا يجب عليه استدعائها نيابة عنك (على سبيل المثال، لبدء الفازر عند النقر على زر في تطبيق Android).
يمكن تعيين رد الاتصال fuzz.init_callback لتنفيذ الكود عندما يكون الفازر جاهزًا للبدء. انظر tests/test_java.js للحصول على مثال.
fuzz.dictionary هو قاموس فازر كلاسيكي، مصفوفة يمكنك إضافة عناصر إليها (الأنواع المقبولة هي Array، ArrayBuffer، Uint8Array، String) تُستخدم كقيم إضافية في المحول. انظر tests/test_libxml2.js للحصول على مثال.
frida-fuzzer يقبل الوسائط التالية:
إذا لم تحدد مجلد الإخراج، يتم إنشاء مجلد مؤقت تحت /tmp.
إذا لم تحدد المجلد الذي يحتوي على البذرة الأولية، يتم استخدام بذرة غير موجهة 0000 كبذرة بداية.
إذا كنت تقوم بفازر تطبيق محلي، فقد ترغب في تنفيذ system-config قبل frida-fuzzer لضبط معلمات النظام وتسريع الأمور.
عند تشغيل ./frida-fuzzer -spawn ./tests/test_linux64 سترى شيئًا مثل شاشة الحالة التالية على الطرفية الخاصة بك:

يمكنك أيضًا إضافة مرحلة مخصصة بسهولة في fuzz/fuzzer.js وإضافتها إلى قائمة المراحل في fuzz/index.js.
لتخصيص الفازر، قم بتعديل fuzz/config.js.
المتغيرات التي قد ترغب في تغييرها هي MAP_SIZE (إذا كان الكود الذي تقوم بفازره صغيرًا، يمكنك تقليله وكسب القليل من السرعة)، MAX_FILE (الحد الأقصى لحجم الإدخال المولد) و QUEUE_CACHE_MAX_SIZE (زيادة حجم ذاكرة التخزين المؤقت لقائمة الانتظار لمزيد من السرعة، خاصة على Android).
دعونا نقوم بفازر المكتبة المشتركة الأصلية في تطبيق Android المثال في tests.
تأكد من أن لديك صلاحية الجذر على جهازك الافتراضي:
host$ adb root
قم بتنزيل خادم frida-server لنظام Android x86_64 من صفحة إصدار المستودع وانسخه على الجهاز تحت /data/local/tmp (استخدم adb push).
ابدأ شيل وقم بتشغيل frida-server:
device# cd /data/local/tmp
device# ./frida-server
الآن قم بتثبيت تطبيق الاختبار tests/app-debug.apk باستخدام السحب والإفلات في نافذة المحاكي.
ثم افتح التطبيق.
قم بتجميع نص العامل باستخدام frida-compile:
host$ frida-compile -x tests/test_ndk_x64.js -o fuzzer-agent.js
افتح التطبيق في المحاكي.
قم بفازر دالة test_func في المكتبة libnative-lib.so المرفقة مع تطبيق الاختبار باستخدام الأمر:
host$ ./frida-fuzzer -U -o output_folder/ com.example.ndktest1
يتم حفظ حالات الاختبار المثيرة للاهتمام والانهيارات في مجلد output_folder.
استمتع.

مرحبًا مجتمع المصادر المفتوحة، هناك الكثير من المهام المتبقية إذا أراد شخص المساهمة.
إذا كان لديك شك في إحدى هذه الميزات، فلا تتردد في مراسلتي على Twitter.
لاقتراحات الميزات، يوجد قسم المشكلات.
| -i FOLDER | المجلد الذي يحتوي على البذور الأولية |
| -o FOLDER | مجلد الإخراج الذي يحتوي على البذور الوسيطة والانهيارات |
| -U | الاتصال بـ USB |
| -spawn | إنشاء وإرفاق بدلاً من الإرفاق البسيط |
| -script SCRIPT | اسم ملف النص البرمجي (الافتراضي هو fuzzer-agent.js) |