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(fuzz.config.MAX_FILE);fuzz.fuzzer_test_one_input = function (/* Uint8Array */ Payload) { Memory.writeByteArray(payload_mem) , 有效负载, 有效负载.长度); 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 上给我发私信。
对于功能提案,有“问题”部分。