使用WinAFL进行Fuzz

1、环境配置

  • Windows 10 虚拟机
  • Visual Studio 2019
  • git 2.31.0
  • CMake 3.20.1
  • dynamorio
  • winafl
  • ida 6.8

2、安装步骤

1、安装git
一路next即可
2、安装CMake
在设置PATH时勾选Add CMake to the system PATH for all users,其它地方一路next
3、编译dynamorio
编译32位
1)首先找到Virsual Studio文件夹中的vcvarsall.bat所在目录,并打开cmd
2)执行以下命令

1
2
3
4
5
vcvarsall x86
cd dynamorio源码目录
mkdir build32 && cd build32
cmake -G"Visual Studio 16 2019" -A Win32 ..
cmake --build . --config RelWithDebInfo

编译64位
1)首先找到Virsual Studio文件夹中的vcvarsall.bat所在目录,并打开cmd
2)执行以下命令

1
2
3
4
5
vcvarsall amd64_x86
cd dynamorio源码目录
mkdir build64 && cd build64
cmake -G"Visual Studio 16 2019" -A x64 ..
cmake --build . --config RelWithDebInfo

4、编译winafl
编译32位
1)首先找到Virsual Studio文件夹中的vcvarsall.bat所在目录,并打开cmd
2)执行以下命令

1
2
3
4
5
vcvarsall x86
cd winafl源码目录
mkdir build32 && cd build32
cmake -G"Visual Studio 16 2019" -A Win32 .. -DDynamoRIO_DIR=dynamorio源码目录\build32\cmake
cmake --build . --config Release

编译64位
1)首先找到Virsual Studio文件夹中的vcvarsall.bat所在目录,并打开cmd
2)执行以下命令

1
2
3
4
5
vcvarsall amd64_x86
cd winafl源码目录
mkdir build64 && cd build64
cmake -G"Visual Studio 16 2019" -A x64 .. -DDynamoRIO_DIR=dynamorio源码目录\build32\cmake
cmake --build . --config Release

1)检测程序会执行哪些代码块

1
drrun.exe -t drcov -- target_module

2)使用winafl.dll检测模块执行概况

1
2
3
4
5
6
7
8
9
drrun.exe -c xxx -debug -target_module xxx -target_offset xxx -fuzz_iterations 10 -nargs 2 -- xxx testcase

-debug //必须为debug模式, 结束后会生成一个log文件
-target_module //目标程序(只能有一个), 也是target_offset所在的模块
-target_offset //目标程序偏移,相对于target_module的偏移,在method无法导出的时候使用
-fuzz_iterations //目标程序重新启动一次内运行目标函数(即target_method)的最大迭代数
-nargs //目标程序执行所需要的参数个数(包括目标程序本身)
-target_module //目标函数,需要export或者调试符号(pdb)
-coverage_module //计算覆盖率的模块,也就是目标程序会调用的模块(dll); (可以有多个)

3)afl-fuzz测试

1
afl-fuzz.exe -i fuzz_in -o fuzz_out -D C:\Fuzz\dynamorio\bin32 -t 20000+ -- -coverage_module xxx -fuzz_iterations 5000 -target_module xxx -target_offset xxx -nargs 2 -- xxx @@