转:智能模糊测试工具 Winafl 的使用与分析

时间:2021-07-31 09:03:21

Winafl是Linux下的智能模糊测试神器afl-fuzz的Windows版本。afl-fuzz从2013年发布到现在,发现了很多真实的漏洞,被广大网络安全从业人员所使用,现在,Windows版本也同样问世,我们同样可以利用它对Windows下的软件进行测试并尝试发现漏洞。

Winafl是一个文件格式及协议漏洞的半自动发现工具,可以帮助我们发现各种使用特定格式文件的应用软件漏洞,如文件编辑软件(doc、xls、pdf等)、图片查看软(bmp、jpg、png等)、视频播放软件(avi、mp4、mpg等)等。

一、编译(直接下载即可,里面包含编译过的文件
Winafl的编译一般情况下不会出现什么问题,过程如下:

可以从https://github.com/ivanfratric/winafl直接下载所有代码的打包文件,也可以使用git for Windows从站点Clone所有代码。下载的代码本身包含编译好的版本,包括32位和64位,你也可以自己编译,这样方便理解、修改和使用Winafl。

1. 下载CMake(),Winafl的编译需要CMake,CMake是一个跨平台的编译软件。

2. 下载DynamoRIO(),一个跨平台开源的分析代码动态instrumentation工具软件。

3. 然后你需要一个编译器,可以用Visual Studio C++,版本的问题是跟CMake有关的,下载最新的CMake,支持VS的2005-2015版本,但由于VS 2010前的版本并不跟C99完全兼容,所以编译的时候会出现stdint.h没有找到的错误,可以从别的和C99兼容的编译器复制一个,比如MinGW、或者直接从网上搜索下载一个。
安装CMake,自动建立环境变量。

4. 建立一个目录,如C:\test,解压Winafl、DynamoRIO到C:\test目录。

5. 启动Visual Studio命令行编译环境,如果要编译32位版本进入32位环境、否则进入64位环境,编译什么版本取决于我们需要fuzzing的软件版本。

6. 进入Winafl目录,可以发现Bin32和Bin64目录,这2个目录是编译好的Winafl,我们可以重新编译
32位下键入如下命令完成编译:

md b32 cd b32 cmake .. -DDynamoRIO_DIR=C:\test\DynamoRIO\cmake(DynamoRIO在你机器上的路径) cmake --build . --config Release(也可以是Debug)

64位下键入如下命令完成编译:

md b64 cd b64 cmake -G"Visual Studio 10 Win64" .. -DDynamoRIO_DIR=C:\test\DynamoRIO\cmake(DynamoRIO在你机器上的路径) cmake --build . --config Release(也可以是Debug)

Winafl编译完成可以使用了,编译好的文件在当前目录下的Release(或Debug)目录。

二、使用
代码编译后生成的主要文件有:

afl-fuzz.exe      主程序 winafl.dll        注入进fuzzing程序的模块

afl-fuzz.exe命令行格式如下:

afl-fuzz [afl options] -- [instrumentation options] -- target_cmd_line

其中[afl options]常用的参数包括(这些参数由afl-fuzz.exe处理):

-i dir     – 测试用例存放目录 -o dir    – fuzzing过程和结果存放目录 -D dir   – 二进制动态Instrumentation工具执行文件路径 -t msec  – 超时设置 -x dir    – 字典文件

…更多参数请查阅afc-fuzz.c的main函数。

[instrumentation options]常用的参数包括(这些参数由winafl.dll处理):

-coverage_module  – fuzzing对象程序会调用到的模块 -target_module – fuzzing对象模块,也就是-target_offset所在的模块 -target_offset – fuzzing的偏移地址,也就是会被instrumentation的偏移 -fuzz_iterations – 再fuzzing对象程序重新启动一次内运行目标函数的最大迭代数 -debug – debug模式

…更多参数请查阅winafl.c的options_init函数。

target_cmd_line参数就是你要fuzzing对象的启动程序。
那么,如果fuzzing winafl默认带的例子,整个命令行如下:

afl-fuzz.exe -i in -o out -D C:\test\DynamoRIO\bin32 -t 20000 -- -coverage_module gdiplus.dll -coverage_module WindowsCodecs.dll -fuzz_iterations 5000 -target_module test_gdiplus.exe -target_offset 0x1260 -nargs 2 -- test_gdiplus.exe @@ -i in 测试用例存放在当前目录下的in目录 -o out 测试结果和过程输出到当前目录下的out目录 -D c:\DynamoRIO-Windows-6.1.1-3\bin32 Instrumentation工具执行文件路径,可以采用相对路径 -t 20000 运行fuzzing对象文件的超时 — 分割

-coverage_module gdiplus.dll -coverage_module WindowsCodecs.dll为fuzzing对象程序会调用的模块,也就是说你fuzzing的偏移地址的函数会调用到这些模块里面的函数,这个可以通过一些PE工具来查看fuzzing对象调用了那些模块,或者通过winafl.dll的-debug模式获得,然后根据反汇编代码判断调用了那些模块,在无法自行判断的情况下我们写的跟-target_module一样即可。

-target_module test_gdiplus.exe -target_offset所在的模块,也是fuzzing的对象模块