winafl就是afl的Windows版本。AFL想必研究fuzz的是不陌生的,但afl并不支持 Windows 平台,所以就有大神把afl移植到了windows平台,就是winafl了。afl 借助编译时插桩和遗传算法实现其功能,由于平台支持的关系,在winafll中该编译时插桩被替换成了 DynamoRIO 动态插桩,此外还基于 Windows API 对相关函数进行了重写。所以winafl=afl+DynamoRIO。
在使用winafl进行fuzzing时需要指定目标程序及对应的输入测试用例文件,且必须存在这么一个用于插桩的目标函数,此函数的执行过程中包括了打开和关闭输入文件以及对该文件的解析,这样在插桩处理后能够保证目标程序循环的执行文件 fuzzing ,避免每次 fuzzing 操作都重新创建新的目标进程。同时,fuzzing 的输入文件会按照相应算法进行变换,且根据得到的目标模块覆盖率判断其是否被用于后续的 fuzzing 操作。
1.下载winafl(https://github.com/ivanfratric/winafl),下载的代码本身包含编译好的版本,包括32位和64位,你也可以自己编译,这样方便理解、修改和使用Winafl
2.下载CMake(http://www.cmake.org),Winafl的编译需要CMake,CMake是一个跨平台的编译软件。安装CMake,注意安装时选择自动建立环境变量。
3.下载DynamoRIO(http://dynamorio.org/),一个跨平台开源的分析代码动态instrumentation工具软件。
4.然后你需要一个编译器,可以用Visual Studio C++,版本的问题是跟CMake有关的,下载最新的CMake,支持VS的2005-2015版本,但由于VS 2010前的版本并不跟C99完全兼容,所以编译的时候会出现stdint.h没有找到的错误,可以从别的和C99兼容的编译器复制一个,比如MinGW、或者直接从网上搜索下载一个。
5.重新编译则请参考github里的winafl说明
For a 32-bit build:
mkdir build32
cd build32
cmake -G"Visual Studio 15 2017" .. -DDynamoRIO_DIR=..\path\to\DynamoRIO\cmake -DINTELPT=1
cmake --build . --config Release
For a 64-bit build:
mkdir build64
cd build64
cmake -G"Visual Studio 15 2017 Win64" .. -DDynamoRIO_DIR=..\path\to\DynamoRIO\cmake -DINTELPT=1
cmake --build . --config Release
环境是win7,在win10上没跑起来
首先我们需要确定 fuzzing 的目标函数,即设置 -target_offset 或 -target_method 对应的参数。在此例中main函数是符合条件的目标函数,若要使用 -target_offset ,则可简单通过 IDA 来查看此函数的偏移,此例中为 0x1680 (IDA默认起始地址是0x400000)。
进入\winafl\bin32目录下,创建文件夹in,把\winafl\testcases\images\bmp下的bmp文件copy到刚创建的in目录下。
如果存在符号文件,那么可以直接设置 -target_method 的参数为main,否则就需使用target_offset,二者不能同时使用。对于 -coverage_module 的参数,我们可以执行如下命令来获取,注意 DynamoRIO 的目录需根据实际情况来设置。在得到的log文件中给出了目标程序执行过程中所加载的模块。
运行后当前目录下会出现如下文件,这个log文件实际上记录了测试test_gdiplus.exe过程中,加载的模块,以及记录了偏移函数位置的变化情况
然后,我们就可以输入如下的命令进行 fuzzing 了,其中 “@@” 表示待 fuzzing 的测试用例文件在 in 目录下
fuzzing 中各阶段的结果都将保存在 -o 选项设置的 out 目录中,其中 crash 或 hangs 目录保存着导致bug的测试用例文件,至于目标程序是否存在可利用的漏洞则需要进一步的确认。