v1.4 حقوق الطبع والنشر (C) 2020 لأندريا فيورالدي [email protected]
تم إصداره بموجب ترخيص Apache v2.0
تم تصميم هذا التشويش التجريبي لاستخدامه في تشويش واجهة برمجة التطبيقات (API) في الذاكرة.
التصميم مستوحى للغاية ويعتمد على AFL/AFL++.
ATM the mutator بسيط للغاية، فقط مراحل الخراب واللصق في AFL.
لقد اختبرت فقط الأمثلة ضمن الاختبارات/، وهذا مشروع قيد التنفيذ ولكن من المعروف أنه يعمل على الأقل على GNU/Linux x86_64 وAndroid x86_64.
أنت بحاجة إلى Frida >= 12.8.1 لتشغيل هذا ( pip3 install -U frida
) وأدوات frida لتجميع الأداة.
يجب استيراد مكتبة 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 = ['مؤشر', ' 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
لإخبار Fuzzer أنك ستتصل fuzz.fuzzing_loop()
في رد اتصال وبالتالي يجب ألا يستدعيه نيابةً عنك (على سبيل المثال، لبدء التشويش عند النقر فوق زر في تطبيق Android).
يمكن ضبط رد الاتصال fuzz.init_callback
لتنفيذ التعليمات البرمجية عندما يكون Fuzzer جاهزًا للبدء. راجع tests/test_java.js
للحصول على مثال.
fuzz.dictionary
هو قاموس غامض كلاسيكي، وهو عبارة عن مصفوفة يمكنك من خلالها إضافة عناصر (الأنواع المقبولة هي Array وArrayBuffer وUint8Array وString) التي يتم استخدامها كقيم إضافية في أداة التعديل. راجع tests/test_libxml2.js
للحصول على مثال.
تقبل frida-fuzzer
الحجج التالية:
-i مجلد | مجلد مع البذور الأولية |
-مجلد | مجلد الإخراج مع البذور المتوسطة وتعطل |
-U | قم بالاتصال بـ USB |
-تفرخ | تفرخ وإرفاق بدلاً من مجرد الإرفاق |
-النص النصي | اسم ملف البرنامج النصي (الافتراضي هو fuzzer-agent.js) |
إذا لم تحدد مجلد الإخراج، فسيتم إنشاء مجلد مؤقت ضمن /tmp. إذا لم تقم بتحديد المجلد بالبذرة الأولية، فسيتم استخدام البذرة غير المطلعة 0000
كبذرة بداية.
إذا كنت تقوم بتشويش تطبيق محلي، فقد ترغب في تنفيذ system-config
قبل frida-fuzzer
لضبط معلمات نظامك وتسريع الأمور.
عند تشغيل ./frida-fuzzer -spawn ./tests/test_linux64
سترى شيئًا مثل شاشة الحالة التالية على جهازك الطرفي:
يمكنك أيضًا بسهولة إضافة مرحلة مخصصة في fuzz/fuzzer.js
وإضافتها إلى قائمة المراحل في fuzz/index.js
.
لتخصيص Fuzzer، قم بتحرير fuzz/config.js
. المتغيرات التي قد ترغب في تغييرها هي MAP_SIZE (إذا كانت التعليمات البرمجية التي تقوم بتشويشها صغيرة، فيمكنك تقليلها والحصول على القليل من السرعة)، وMAX_FILE (الحد الأقصى لحجم الإدخال الذي تم إنشاؤه) وQUEUE_CACHE_MAX_SIZE (زيادة حجم ذاكرة التخزين المؤقت لقائمة الانتظار لـ سرعة أكبر، خاصة على نظام Android).
دعونا ندمج المكتبة المشتركة الأصلية في مثال تطبيق Android في tests
.
تأكد من أن لديك الجذر على جهازك الظاهري:
host$ adb root
قم بتنزيل Android x86_64 frida-server من صفحة إصدار الريبو وانسخه على الجهاز ضمن /data/local/tmp (استخدم adb Push).
ابدأ تشغيل Shell وقم بتشغيل خادم frida:
device# cd /data/local/tmp device# ./frida-server
الآن قم بتثبيت tests/app-debug.apk
باستخدام السحب والإسقاط في نافذة المحاكي.
ثم افتح التطبيق.
قم بتجميع البرنامج النصي للوكيل مع ترجمة frida:
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
يتم حفظ حالات الاختبار والأعطال المثيرة للاهتمام في ملف الإخراج.
يتمتع.
مرحبًا بمجتمع OSS، هناك الكثير من المهام إذا أراد شخص ما المساهمة.
تشويش كود Java (في انتظار الأساليب المكشوفة الإضافية في frida-Java-bridge، يجب أن يكون سهلاً، أوشك على الانتهاء)
مرحلة اللصق (دمج حالتي اختبار في قائمة الانتظار وإحداث الفوضى عليهما)
دعم القواميس (وبالتالي تعديل الفوضى أيضًا)
اختيار البذور
الأجهزة المضمنة للذراع64
تسجيل الأداء (استكشاف الجدول الزمني لـ AFL)
المحرك الهيكلي (تحويل البايتات بناءً على القواعد النحوية المكتوبة بلغة JSON)
مقارنة التغطية (ملف تعريف التعليمات الفرعية لتجاوز حواجز الطرق الغامضة)
أعد كتابة frida-fuzzer بلغة C باستخدام frida-core لتتمكن من تشغيل جميع الأشياء على الجهاز المحمول
إذا كان لديك شك في إحدى هذه الميزات، فلا تتردد في مراسلتي مباشرة على Twitter.
للحصول على مقترحات الميزات، هناك قسم القضايا.