Loading... ## 测试环境 * windows10 * Visual Studio 2022 * cmake 3.18.0-rc2 * git * perl 我建议Windows10设置 1. 设置Windows 10 调试模式 1. **bcdedit /set testsigning on**开启 2. **bcdedit /set testsigning off**关闭 3. 重启生效 ## 安装 1. 安装[Git](https://git-scm.com/) 2. 安装[perl](https://strawberryperl.com/) 3. 安装[CMAKE GUI版本](https://cmake.org/download/) ### 编译dynamorio 32位生成 ```cpp //创建fuzz文件夹,在文件夹内打开cmd git clone https://github.com/DynamoRIO/dynamorio.git cd dynamorio mkdir build32 && cd build32 ``` 正常填写路径之后,点击Configure 选择当前生成x86 x64 和 VSstudio的版本, 32位和64位生成方式一样,建议试用git直接下载 64位如果出错可以手动编译【我在CMAKE GUI无错误】 ```cpp //everything 找到 vcvarsall vcvarsall amd64_x86 切换到64位编译环境 cd xxx mkdir build64 && cd build64 cmake -G"Visual Studio 17 2022" -A x64 .. cmake --build . --config RelWithDebInfo ``` -----------------------注意编译完成直接进入 VS2022打开就可以直接编译 选择需要编译的库地址,选择输出路径,Configure,Generate开始生成项目,生成完成VS直接打开生成即可。 ![image.png](https://www.irohane.top/usr/uploads/2022/07/2880672582.png) ### 编译winafl --- Winafl手动生成即可 git clone--recursive [https://github.com/googleprojectzero/winafl](https://github.com/googleprojectzero/winafl) * 编译32位 winafl ```cpp vcvarsall x86 //在Visual studio VC环境下 切换到vcvarsall x86模式中 cd到winafl目录 mkdir build32 && cd build32 cmake -G"Visual Studio 17 2022" -A Win32 .. -DDynamoRIO_DIR=C:\fuzz\dynamorio\build32\cmake //cmake的绝对路径 cmake --build . --config Release ``` * 编译64位 winafl ```cpp vcvarsall amd64_x86 cd到winafl目录 mkdir build64 && cd build64 cmake -G"Visual Studio 17 2022" -A x64 .. -DDynamoRIO_DIR=C:\fuzz\dynamorio\build64\cmake //cmake的绝对路径 cmake --build . --config Release ``` ### 功能测试 #### Dynamorio测试 1. 动态插桩 drrun.exe在dynamorio/buildxx/binxx/目录下,以test_gdiplus.exe为例 在dynamorio 生成的Build G:\Github\dynamorio\build32\bin32路径下 0x0 是需要在IDA中摘到Main函数的偏移 0x401200 | 0x0 替换为 0x1200 随意找一个bmp即可 `drrun.exe -c winafl.dll -debug -target_module test_gdiplus.exe -target_offset 0x0 -fuzz_iterations 10 -nargs 2 -- test_gdiplus.exe input.bmp` 运行之后会出现一个Log文件打开后和这个差不多,也可能是DLL导入目录 ![image.png](https://www.irohane.top/usr/uploads/2022/07/7410750.png) #### winafl-fuzz功能测试 在当前目录下创建 in 和 out文件 并把 bmp图片放入 in ```cpp afl-fuzz.exe -i in -o out -D C:\fuzz\dynamorio\build32\bin32 -t 20000 -- -coverage_module gdiplus.dll -coverage_module WindowsCodecs.dll -fuzz_iterations 5000 -target_module test_gdiplus.exe -target_offset X -nargs 2 -- test_gdiplus.exe @@ ``` * -i 测试样本的输入目录 * -o fuzz结果的输出目录 * -D DynamoRIO所处的目录 * -t 每次的运行时间 * -f 被fuzz的进程要读取的文件 * -x 可选fuzzer目录 使用说明 1. 首先找出要fuzz的函数基于模块的地址偏移 2. 要保证程序可以正常的跑在DynamoRIO下面,可以通过WinAFL的独立调试模式来测试这一点。独立调试模式不会使用fuzz部分(使用-debug选项) 3. 要想正常运行,必须要保证afl-fuzz.exe和winafl.dll在同一目录下 4. afl-fuzz [afl options] -- [instrumentation options] -- target_cmd_line 5. -D选项是必须启用的,用于指定DynamoRIO所处的目录 6. -t选项也是必须启用的,由于不同的选项导致的执行效率不同。所以-t的时间应该灵活设置。 7. 默认是支持多线程的程序记录的。如果是单线程程序可以使用-covtype edge选项 instrumentation options * -covtype 设置记录方式,为多线程和单线程程序所使用。bb/edge * -coverage_module 设置要记录的模块,支持多个模块的记录 * -target_module fuzz目标函数所处的模块,必须要设置-target_method或-target_offset * -target_method 只有有符号表的情况下才能用的方法,根据符号名去搞 * -target_offset 要fuzz函数的相对模块头的偏移 * -fuzz_iterations 目标函数的最大迭代次数 * -nargs 被fuzz的函数有几个参数? * -debug 不会连接fuzzer部分,只会输出一个日志文件。包含加载的模块、打开的文件和输出报告。 * -logdir 只在-debug下可用,输出的log文件的位置 正常运行之后,如下图一样 ![image.png](https://www.irohane.top/usr/uploads/2022/07/390893373.png) 如果还不懂: 请跳转 https://www.cnblogs.com/buchiyexiao/p/15140423.html 最后修改:2022 年 07 月 10 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏