Jackalope
Jackalope是一个可定制的、分布式的、基于覆盖率引导的模糊测试工具,该工具能够以黑盒测试的方式处理二进制文件,并且支持Windows和macOS操作系统。
虽然社区现在已经有很多优秀的基于覆盖率引导模糊测试工具,可以在获取到源代码的基础上进行安全审计和分析。但是基于黑盒测试的工具相对较少,尤其是针对Windows和macOS操作系统的工具。而对于那些已有的黑盒测试工具,它们在代码库可定制方面又缺乏一定的可扩展性。
Jackalope的目标如下:
1、可以通过自定义功能扩展的形式来针对不同的目标进行黑盒模糊测试,其中包括:
自定义变异; 自定义样本交付机制; 自定义指令等等;
2、支持并行,既可以在一台机器上运行,也可以跨多台机器运行。
Jackalope可以独立使用,但是作为功能库使用时功能会更强大,因为用户可以插入自定义组件来替换工具的默认行为。默认配置下,Jackalope自带了下列组件:
使用TinyInst的二进制指令; 一组简单的通用变异样本; 通过文件或共享内存传递样本;
除此之外,Jackalope还可以并行运行!在一台设备上,可以通过“-nthreads”命令行参数来指定模糊测试的线程数量。跨多台设备的话,可以使用“-start_server”命令行参数来将一台主机以服务器运行,然后让运行模糊测试工具的工作机器使用“-server”命令连接至这台服务器。接下来,服务器将收集并分发样本和命令给工作机器。
但是,当前版本的Jackalope还未包含高级变异策略,而是只带有一组通用变异器,这将适用于许多测试场景。不过,我们鼓励广大研究人员根据自己的需要去编写定制的变异器和变异策略。
工具下载
广大研究人员可以使用下列命令将该项目源码克隆至本地:
代码语言:javascript复制git clone https://github.com/googleprojectzero/Jackalope.git
构建Jackalope
首先,打开一个命令行终端,设置好我们的构建环境。在Windows上,我们需要打开Visual Studio命令行窗口,或运行vcvars64.bat / vcvars32.bat。
接下来,切换到包含工具源码的目录。
然后运行下列命令:
代码语言:javascript复制git clone --recurse-submodules git@github.com:googleprojectzero/TinyInst.git
(alternately: git clone --recurse-submodules https://github.com/googleprojectzero/TinyInst.git)
mkdir build
cd build
cmake <generator arguments> ..
cmake --build . --config Release
生成器参数取决于您的环境。在macOS上,您可能希望使用-G Xcode,而在带有Visual Studio 2019的Windows上,对于64位构建,您可能会使用-G “Visual Studio 16 2019” -A x64。
如果在macOS上收到了“No CMAKE_C_COMPILER could be found”的错误提醒,请尝试更新cmake,并确保Xcode安装正确。
Jackalope运行
使用命令:
代码语言:javascript复制./fuzzer <fuzzer arguments> <instrumentation and other components arguments> -- <target command line>
该工具目前支持下列命令行参数:
代码语言:javascript复制-in:设置输入目录,目录中包含初始样本集;
-out:输出目录;
-t:样本超时(毫秒);
-t1:目标初始化超时,默认为样本超时;
-nthreads:模糊测试器的线程数量,默认为1;
-delivery <file|shmem>:样本交付机制;
-restore或-resume:还原或恢复之前的模糊测试会话,模糊测试器和服务器进程都支持状态恢复。
-server:指定需要使用的服务器;
-start_server:运行一个服务器进程;
macOS使用样例:
代码语言:javascript复制./fuzzer -in in -out out -t 1000 -delivery shmem -instrument_module test -target_module test -target_method __Z4fuzzPc -nargs 1 -iterations 10000 -persist -loop -cmp_coverage -- ./test -m @@
Windows使用样例:
代码语言:javascript复制fuzzer.exe -in in -out out -t 1000 -delivery shmem -instrument_module test.exe -target_module test.exe -target_method fuzz -nargs 1 -iterations 10000 -persist -loop -cmp_coverage -- test.exe -m @@
自定义功能
如需根据自己的需要去进行自定义开发,则需要继承Fuzzer类,并重写相关方法,具体可以参考main.cpp中的样例。需要重写的方法如下:
CreateMutator():针对模糊测试工具创建变异器配置。
OutputFilter():可以在将样本传递给目标之前修改样本,例如修复Header或校验和。默认实现将按原样传递示例。
AdjustSamplePriority():模糊测试器会维护一个按优先级排序的样本队列。此方法可用于在每次运行后调整样本的优先级。对于未产生新覆盖率的每次运行,默认实现会降低样本的优先级。如果一次运行产生了新的覆盖率,则重置样本的优先级。
CreateSampleDelivery():可用于定义将样本传递到目标的自定义机制。例如通过网络或IPC发送样本。
CreateInstrumentation():重写以控制模糊测试工具使用自定义指令。
CreatePRNG():重写以使用自定义PRNG。
项目地址
Jackalope:【点击底部阅读原文获取】