Loading... ## 简单介绍一下几种黑盒测试方法 1. 正常fuzz 一般定位到对应的目标函数后直接fuzz,不做任何额外的处理,相对而言调试所消耗的时间较少,但是Fuzz速率较慢,产生新path和crash的时间间隔较长,一般为最差选项 2. 构造harness 一般构造于其对应的IDA反汇编相对比较清晰,函数API调用比较明显的情况,或用于DLL等具有较多说明文档的情况,相对而言需要汇编能力较强 3. 魔改程序 直接魔改,简化部分不必要且没有意义的流程 ## 首先对此dll库进行构造harness,得到对应的执行程序,我们构造的harness主要fuzz目标为fuzz函数 进行drrun动态插桩 `C:\fuzz\dynamorio\build32\bin32\drrun.exe -c winafl.dll -debug -coverage_module xx.dll -target_module test1.exe -target_method fuzz -fuzz_iterations 10 -nargs 2 -- test1.exe C:\Users\Administrator\Desktop\input.bmp` ## 第一个测试程序 ### 使用Visual studio 编译下面代码 ```cpp #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> int main(int argc, char* argv[]) { char tmp[30]; char buff[1024]; FILE* fp; if (argc >= 2) { fp = fopen(argv[1], "rb"); if (fp == NULL) { printf("can not load file!\n"); return 1; } fgets(buff, 1024, fp); //读取文件内容 fclose(fp); strcpy(tmp, buff); //存在栈溢出漏洞 printf("%s\n", tmp); return 1; } return 0; }//Firsttest.exe ``` `G:\Github\dynamorio\build32\bin32>drrun.exe -c winafl.dll -debug -target_module FirstTest.exe -target_offset 0x1040 -fuzz_iterations 10 -nargs 2 -- FirstTest.exe input.txt` 注意:-target_offset 0x1040 是IDA在main中找到的位置0x401040 0x1040 ![image.png](https://www.irohane.top/usr/uploads/2022/07/90495189.png) ![image.png](https://www.irohane.top/usr/uploads/2022/07/714603.png) 在命令完成后,会生成一个txt文件 ![image.png](https://www.irohane.top/usr/uploads/2022/07/1503739738.png) ## 测试WinAfl 在WinAfl生成的路径下,生成in、Out文件夹。 将测试的input.txt文件放入in文件夹下。 ![image.png](https://www.irohane.top/usr/uploads/2022/07/1237019803.png) ![image.png](https://www.irohane.top/usr/uploads/2022/07/2914019398.png) 测试: `G:\Github\winafl\build32\bin\Debug>afl-fuzz.exe -i in -o out -D G:\Github\dynamorio\build32\bin32 -t 20000 -- -coverage_module ntdll.dll -fuzz_iterations 5000 -target_module FirstTest.exe -target_offset 0x1040 -nargs 2 -- FirstTest.exe @@` 参数说明: ```cpp -i //存放样本的目录 -o //保存输出数据,包括 crash文件、测试用例等 -D //DynamoRIO的路径 (drrun, drconfig) -t msec //每一次样本执行的超时时间 第一个"--"分割符 //后面跟的是插桩的参数 第二个"--"分割符 //后面跟的是目标程序的参数 @@ //引用 -i 参数的中的测试用例 ``` 测试结果: ![image.png](https://www.irohane.top/usr/uploads/2022/07/1491245050.png) ![image.png](https://www.irohane.top/usr/uploads/2022/07/83174672.png) 各模块含义: ```cpp Process timing //Fuzzer运行时长、以及距离最近发现的路径、崩溃和挂起经过了多长时间 Overall results //Fuzzer当前状态的概述 Cycle progress //当前Fuzz的进展 Map coverage //目标二进制文件中的插桩代码所观察到覆盖范围的细节 Stage progress //Fuzzer现在正在执行的文件变异策略、执行次数和执行速度 Findings in depth //有关我们找到的执行路径,异常和挂起数量的信息 Fuzzing strategy yields //关于突变策略产生的最新行为和结果的详细信息 Path geometry //有关Fuzzer找到的执行路径的信息 CPU load //CPU利用率 ``` ![image.png](https://www.irohane.top/usr/uploads/2022/07/3291334580.png) 重点 是crashes目录,这个目录中保存运行异常时的文本信息 ![image.png](https://www.irohane.top/usr/uploads/2022/07/2102854796.png) 可以看到很贴心的帮我们分析到了栈溢出和执行异常 ![image.png](https://www.irohane.top/usr/uploads/2022/07/382920483.png) 最后修改:2022 年 07 月 10 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏