freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Frida-Fuzzer:一款针对API的内存模糊测试框架
2020-06-04 15:00:31

Fuzz-Testing.pngFrida-Fuzzer是一款针对API的内存模糊测试框架,该工具的设计和开发灵感来源于AFL/AFL++,Frida-Fuzzer的当前版本支持在GNU/Linux x86_64和Android x86——64平台上运行。

除此之外,你还使用下列命令安装Frida >= v12.8.1frida-tools来对项目代码进行编译和使用该工具。

pip3 install -U frida

工具下载

广大研究人员可以使用下列命令将项目源码克隆至本地:

git clone https://github.com/andreafioraldi/frida-fuzzer.git

工具使用

在项目代码中,fuzz库必须导入至一个自定义Harness中,然后使用frida-compile进行编译并生成一个代理,随后Frida-Fuzzer会将生成的代理注入到目标应用程序之中。

Frida-Fuzzer的所有功能逻辑都在这个生成的代理之中,功能也全部由这个代理来实现。

前文所述的自定义Harness格式如下:

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()

fuzz.init_callback回调在设置之后,可以让模糊测试器在准备开始工作之后便执行代码,具体样例可以参考tests/test_java.js

fuzz.dictionary是一个典型的模糊测试字典,其中包含了一个数组,你可以向其中添加数据对象,支持的类型有ArrayArrayBufferUint8ArrayString,它们都可以作为变异器的额外变异因子。具体样例可以参考tests/test_libxml2.js

Frida-Fuzzer支持接收下列参数:

-i FOLDER包含初始化种子的目录
-o FOLDER包含中间种子和崩溃信息的输出目录
-U连接USB
-spawn生成附加数据
-script SCRIPT脚本文件名(默认为fuzzer-agent.js

如果你不指定输出目录的话,该工具将会在/tmp目录下创建一个临时文件夹。如果你不指定包含初始化种子的目录,该工具将会使用0000作为初始种子。

如果你是在对一个本地应用程序进行模糊测试的话,你可能需要在执行Frida-Fuzzer之前执行system-config来调整系统执行参数并优化任务执行。

运行下列命令之后,你将会在终端窗口中看到下列工具状态信息:

./frida-fuzzer -spawn ./tests/test_linux64

screen.png

你还可以在fuzz/fuzzer.js中添加自定义步骤,并将其添加到fuzz/index.js的步骤列表中。

如需对模糊测试器进行自定义设置,可以编辑fuzz/config.js文件,此时你需要修改的变量为MAP_SIZE(可以降低代码大小以实现速度优化)、MAX_FILE(生成输入的最大大小)和QUEUE_CACHE_MAX_SIZE(增加队列缓存大小以实现速度提升)。

工具使用样例

比如说,我们要对一个样例Android应用程序的本地共享库进行测试,首先你需要确保已经在虚拟设备中实现了root:

host$ adb root

从该项目的Release页面下载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,安装完成后运行App。

使用frida-compile编译代理脚本:

host$ frida-compile -x tests/test_ndk_x64.js -o fuzzer-agent.js

在模拟器中打开App。

使用下列命令对测试App中libnative-lib.so库的test_func函数进行测试:

host$ ./frida-fuzzer -U -o output_folder/ com.example.ndktest1

测试样例和崩溃信息等输出结果都将保存在项目的output_folder中。

测试截图如下:

screen1.png

项目地址

Frida-Fuzzer:【GitHub传送门

* 参考来源:andreafioraldi,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

# Frida
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者