
यह प्रायोगिक fuzzer API in-memory fuzzing के लिए उपयोग किया जाने वाला है।
v1.4 कॉपीराइट (C) 2020 Andrea Fioraldi [email protected]
Apache लाइसेंस v2.0 के तहत जारी
यह प्रायोगिक फज़र API इन-मेमोरी फज़िंग के लिए उपयोग किया जाने वाला है।
डिज़ाइन AFL/AFL++ से अत्यधिक प्रेरित और आधारित है।
ATM (अभी के लिए) म्यूटेटर काफी सरल है, केवल AFL के हैवॉक और स्प्लाइस चरण।
मैंने केवल tests/ के अंतर्गत उदाहरणों का परीक्षण किया है, यह एक WIP प्रोजेक्ट है लेकिन कम से कम 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 का उपयोग प्रारंभिक सीड के रूप में किया जाता है।
यदि आप किसी स्थानीय एप्लिकेशन को फज़ कर रहे हैं, तो आप frida-fuzzer से पहले system-config चलाना चाह सकते हैं ताकि आपके सिस्टम के पैरामीटर ट्यून हो सकें और चीजें तेज़ हो सकें।
./frida-fuzzer -spawn ./tests/test_linux64 चलाने पर आपको अपने टर्मिनल पर निम्नलिखित जैसी स्थिति स्क्रीन दिखाई देगी:

आप fuzz/fuzzer.js में एक कस्टम स्टेज भी आसानी से जोड़ सकते हैं और इसे fuzz/index.js में स्टेजेस की सूची में जोड़ सकते हैं।
फज़र को अनुकूलित करने के लिए, fuzz/config.js संपादित करें।
जिन वेरिएबल्स को आप बदलना चाह सकते हैं वे हैं MAP_SIZE (यदि आप जिस कोड को फज़ कर रहे हैं वह छोटा है तो आप इसे कम करके थोड़ी गति प्राप्त कर सकते हैं), MAX_FILE (उत्पन्न इनपुट का अधिकतम आकार) और QUEUE_CACHE_MAX_SIZE (क्यू कैश का आकार बढ़ाएँ अधिक गति के लिए, विशेष रूप से Android पर)।
चलिए tests में उदाहरण Android ऐप में देशी साझा लाइब्रेरी को फज़ करते हैं।
सुनिश्चित करें कि आपके वर्चुअल डिवाइस पर रूट है:
host$ adb root
Android x86_64 frida-server को रिपो रिलीज़ पेज से डाउनलोड करें और इसे डिवाइस पर /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
एमुलेटर में ऐप खोलें।
टेस्ट ऐप के साथ शिप की गई libnative-lib.so लाइब्रेरी के test_func फ़ंक्शन को निम्नलिखित कमांड से फज़ करें:
host$ ./frida-fuzzer -U -o output_folder/ com.example.ndktest1
दिलचस्प टेस्टकेस और क्रैश दोनों output_folder में सहेजे जाते हैं।
आनंद लें।

अरे OSS समुदाय, यदि कोई योगदान देना चाहता है तो बहुत सारे TODOs हैं।
यदि इनमें से किसी एक सुविधा के बारे में संदेह है तो बेझिझक मुझे Twitter पर DM करें।
सुविधा प्रस्तावों के लिए, Issues अनुभाग है।
| -i FOLDER | प्रारंभिक सीड्स वाला फ़ोल्डर |
| -o FOLDER | मध्यवर्ती सीड्स और क्रैश वाला आउटपुट फ़ोल्डर |
| -U | USB से कनेक्ट करें |
| -spawn | स्पॉन और अटैच करें बजाय केवल अटैच करने के |
| -script SCRIPT | स्क्रिप्ट फ़ाइल नाम (डिफ़ॉल्ट fuzzer-agent.js है) |