v1.4 版權所有 (C) 2020 安德里亞·菲奧拉迪 [email protected]
根據 Apache License 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 = [' int'];var func_handle = new NativeFunction(TARGET_FUNCTION, RET_TYPE, ARGS_TYPES, { traps: 'all' });fuzz.target_module = TARGET_MODULE;var payload_mem = Memory.alloc(fuzzone. (/* 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
接受以下參數:
-i 資料夾 | 帶有初始種子的資料夾 |
-o 資料夾 | 包含中間種子和崩潰的輸出資料夾 |
-U | 連接至 USB |
-產卵 | 產生並附加而不是簡單地附加 |
-腳本腳本 | 腳本檔名(預設為 fuzzer-agent.js) |
如果不指定輸出資料夾,則會在 /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 應用程式中的本機共用程式庫進行模糊測試。
確保您的虛擬設備具有 root 權限:
host$ adb root
從 repo 發布頁面下載 Android x86_64 frida-server 並將其複製到裝置上的 /data/local/tmp 下(使用 adb Push)。
啟動 shell 並執行 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 社區,如果有人想貢獻的話,這裡有很多 TODO。
Java 程式碼模糊測試(等待 frida-java-bridge 中其他公開的方法,應該很容易,幾乎完成)
拼接階段(合併佇列中的兩個測試案例並對其進行破壞)
支持字典(因此修改也會造成嚴重破壞)
選種
arm64 的內嵌儀表
表現評分(探索 AFL 賽程表)
結構變異器(基於 JSON 編寫的語法變異位元組)
CompareCoverage(子指令分析以繞過模糊測試障礙)
使用 frida-core 以 C 語言重寫 frida-fuzzer,以便能夠在行動裝置上執行所有內容
如果您對其中一項功能有疑問,請隨時在 Twitter 上私訊我。
對於功能提案,有“問題”部分。