当前位置: 首页>行业 >

环球要闻:WinAFL小白踩坑指南,你学会了吗?

来源: FreeBuf.COM | 时间: 2023-05-04 10:41:14 |

本文主要内容包括:WinAFL介绍与安装、以ABC看图程序为例构建Fuzz最小案例库、执行Fuzz跑出Crash,以及最终利用Bugid对Crash分类

WinAFL介绍与安装

WinAFL,是Ivan Fratric基于lcumtuf的AFL创建的大型Fuzzing程序,由于AFL无法在windows下直接使用,Winafl弥补了这一空白,使用DynamoRIO来插桩&测量代码覆盖率,并使用Windows API进行内存和进程创建。

WinAFL 项目地址:https://github.com/ivanfratric/winafl


(相关资料图)

请注意:Windows 10 1809及更高版本的最新Windows版本要使用DynamoRIO 8.0.0以上版本

此时如果直接进行操作可能会出现以下报错

需要re-compiled ,这个过程为:

(1) 下载安装DynamoRio源码,或者直接下载DynamoRio Windows版的二进制包(https://github.com/DynamoRIO/dynamorio/wiki/Downloads)

(2) 打开Visual Studio命令提示工具,如果要安装成64位版本的则打开Visual Studio x64命令提示工具(一般在【开始—所有程序—Visual Stdio—Visual Studio Tools】中可找到)。因为在对64位程序进行fuzz时,需要有64-bit的winafl.dll,所以安装时要选择好版本

(3)在命令提示工具中进入WinAFL的目录下

(4) 在Visual Studio命令提示工具中输入如下命令进行WinAFL编译安装(需将-DDynamoRIO_DIR参数设置为你的DynamoRIO cmake文件所在位置)

32-bit build:

mkdir build32cd build32cmake -G"Visual Studio 16 2019" -A Win32 .. -DDynamoRIO_DIR=..\path\to\DynamoRIO\cmake cmake --build . --config Release

64-bit build:

mkdir build64cd build64cmake -G"Visual Studio 16 2019" -A x64 .. -DDynamoRIO_DIR=..\path\to\DynamoRIO\cmakecmake --build . --config Release

这里需要注意一下-G选择平台时VS16与之前版本默认目标平台架构是有些区别的:

cmake -G "Visual Studio 16 2019" -A Win32   ;x32cmake -G "Visual Studio 16 2019" -A x64     ;x64  默认目标平台名称(架构)为Win64cmake -G "Visual Studio 15 2017"            ;x32  默认目标平台名称(架构)为Win32cmake -G "Visual Studio 15 2017 Win64"      ;x64

winafl 命令行参数,主要分为三段,(afl执行参数–dynamoRIO执行参数–程序执行参数)

afl执行参数主要包括

-i -o指定输入和输出文件夹

-D指定DynamoRIO根目录

-t每一次样本执行的超时时限

-ffuzz 程序读取的位置

-M \ -S分布式模式

-x可选的fuzz字典

dynamRIO执行参数主要包括

-coverage_module计算覆盖率的模块

-fuzz_iterations在重新启动目标进程之前,目标函数要运行的最大迭代次数。

-target_module包含目标函数的模块(一个可执行文件镜像)需要与该选项一起指定-target_method或-target_offset

-target_method目标函数,需要export或者带符号

-target_offset目标偏移,相对于target_module的偏移,在method无法导出的时候使用

-nargs程序执行所需要的参数个数

-debug调试模式。不要尝试连接到服务器。输出包含已加载模块,打开的文件和覆盖率信息的日志文件

-logdir指定将日志文件写入哪个目录(仅与-debug一起使用)

程序执行参数就是要fuzz的程序的命令行构建Fuzz最小案例库

现在我们从网上搜集一堆ABC看图支持的格式,包括tif、jpg、png、ico等,github上有许多Fuzz的案例库,这样的案例库中包含大量的文件,运行起来效率会很差。根据学长博客,AFL是存在语料库蒸馏(Corpus Distillation)工具的,afl-cmin和afl-tmin。

移除执行相同代码的输入文件——AFL-CMINafl-cmin的核心思想是:尝试找到与语料库全集具有相同覆盖范围的最小子集。举个例子:假设有多个文件,都覆盖了相同的代码,那么就丢掉多余的文件。减小单个输入文件的大小——AFL-TMIN整体的大小得到了改善,接下来还要对每个文件进行更细化的处理。afl-tmin尽量缩减文件体积。

在winafl中,他们存在于 winafl-cmin.py,对输入的样本文件进行最小化处理,以用来提高 WinAFL 的执行效率。

筛选命令

python winafl-cmin.py --working-dir C:\Users\test\Desktop\winafl-master\build32\bin\Release -D C:\Users\test\Desktop\DynamoRIO-Windows-8.0.0-1\bin32 -t 100000 -i C:\Users\test\Desktop\jpg -o C:\Users\test\Desktop\jpg\out -coverage_module FreeImage.dll -target_module Project1.exe -target_method main -nargs 2 -- C:\Users\test\source\repos\Project1\Release\Project1.exe @@

此时可能出现[!] Dry-run failed, 2 executions resulted differently:Tuples matching? False的报错

看来测试用例中存在一些坏的用例,导致不能正确精简,在语料库所在文件夹可以利用以下bash脚本简单判断一下

λ for file in *; do printf "==== FILE: $file =====\n";/c/Users/test/source/repos/Project1/Release/Project1.exe $file ;echo $?; done

正常运行的文件返回值都是0,有问题的文件返回结果都不太正常

把这些返回结果不太正常的删除之后,再运行一次语料库蒸馏,发现运行成功了

可以看到原本429张被精简到了148张,确实少了不少,根据参考教程中的提示,Winafl在处理大于4Kb的图片时,速度会变得很慢,因此再删除一波,最终语料库就剩下这么点了。

开始运行

经过动态和静态的简单分析后,发现ABC看图主要调用Freeimage.dll进行图片解析的,决定对 FreeImage 库的载入函数进行模糊测试,针对 FreeImage_LoadU 函数编写测试程序

#define _CRT_SECURE_NO_WARNINGS#include  #include #include using namespace std;extern "C" __declspec(dllexport) int main(int argc, char** argv);void test(HINSTANCE hinstLib, wchar_t* PathName);wchar_t* charToWChar(const char* text);typedef DWORD(__stdcall* FreeImage_GetFileTypeU)(const wchar_t* lpszPathName, int flag);typedef DWORD(__stdcall* FreeImage_Initialise)(BOOL load_local_plugins_only);typedef DWORD(__stdcall* FreeImage_DeInitialise)();typedef DWORD(__stdcall* FreeImage_LoadU)(DWORD format, const wchar_t* lpszPathName, int flag);typedef DWORD(__stdcall* FreeImage_UnLoad)(DWORD dib);FreeImage_Initialise Initialise;FreeImage_GetFileTypeU LoadFileType;FreeImage_LoadU LoadU; DWORD load;FreeImage_UnLoad UnLoad;FreeImage_DeInitialise DeInitialise;int main(int argc, char** argv){if (argc < 2) {printf("Usage: %s < file>\n", argv[0]);return 0;}wchar_t* PathName = charToWChar(argv[1]);HINSTANCE hinstLib; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; DWORD Error = NULL;hinstLib = LoadLibrary(TEXT("C:\\FreeImage.dll"));if (hinstLib != NULL){fRunTimeLinkSuccess = TRUE;Initialise = (FreeImage_Initialise)GetProcAddress(hinstLib, (LPCSTR)163); // 初始化 FreeImage 库LoadFileType = (FreeImage_GetFileTypeU)GetProcAddress(hinstLib, (LPCSTR)126);// 获取位图文件类型LoadU = (FreeImage_LoadU)GetProcAddress(hinstLib, (LPCSTR)181);// 加载位图UnLoad = (FreeImage_UnLoad)GetProcAddress(hinstLib, (LPCSTR)242);// 卸载位图DeInitialise = (FreeImage_DeInitialise)GetProcAddress(hinstLib, (LPCSTR)83);//卸载 FreeImage 库test(hinstLib, PathName);fFreeResult = FreeLibrary(hinstLib);}if (!fRunTimeLinkSuccess)cout << "加载函数失败, Error: " << Error << endl;return 0;}void test(HINSTANCE hinstLib, wchar_t* PathName){DWORD FileType = (LoadFileType)(PathName, 0);load = (LoadU)(FileType, PathName, 0);return;}wchar_t* charToWChar(const char* text){size_t size = strlen(text) + 1;wchar_t* wa = new wchar_t[size];mbstowcs(wa, text, size);return wa;}

在对该程序进行编译之后,可以先简单测试一下WinAFL 是否可以正常使用。-debug 表示设置为调试模式。

\winafl\bin32> C:\Users\test\Desktop\DynamoRIO-Windows-8.0.0-1\bin32\drrun.exe -c winafl.dll -debug -coverage_module FreeImage.dll -target_module Project1.exe -target_method main -fuzz_iterations 10 -nargs 2 -- C:\Users\test\source\repos\Project1\Debug\Project1.exe C:\Users\test\Desktop\jpg\1x1-low.jpg

如下图所示,日志文件当中模块加载正常并没有错误显示

下面就要开始模糊测试了,按照教程进行的,但是它的目标函数是main,我们来看看结果如何。

afl-fuzz.exe -i C:\Users\test\Desktop\jpg\out -o C:\Users\test\Desktop\jpg\re -D C:\Users\test\Desktop\DynamoRIO-Windows-8.0.0-1\bin32 -t 9000 -- -coverage_module FreeImage.dll -target_module Project1.exe -target_method main -fuzz_iterations 5000 -nargs 2 -- C:\Users\test\source\repos\Project1\Debug\Project1.exe @@

如图所示,可以跑是可以跑,但是这个速度实在太慢了,执行main函数浪费了太多时间,实际上我们的load函数只测test函数就可以,我们将-target_method改为test尝试一下

afl-fuzz.exe -i C:\Users\test\Desktop\jpg\out -o C:\Users\test\Desktop\jpg\re -D C:\Users\test\Desktop\DynamoRIO-Windows-8.0.0-1\bin32 -t 9000 -- -coverage_module FreeImage.dll -target_module Project1.exe -target_method test -fuzz_iterations 5000 -nargs 2 -- C:\Users\test\source\repos\Project1\Debug\Project1.exe @@

然后就蹦框了,看起来是没有找到我们写的test函数,忘了在vs里把test函数也导出

这里导出后再编译一遍,再尝试一下,成功了,这速度明显提升了好几倍啊

为了让fuzz效率更高一点,充分利用cpu的多核,进行多核系统的并行测试

afl-fuzz.exe -i C:\Users\test\Desktop\jpg\out -o C:\Users\test\Desktop\jpg\re -M master -D C:\Users\test\Desktop\DynamoRIO-Windows-8.0.0-1\bin32 -t 9000 -- -coverage_module FreeImage.dll -target_module Project1.exe -target_method test -fuzz_iterations 5000 -nargs 2 -- C:\Users\test\source\repos\Project1\Debug\Project1.exe @@afl-fuzz.exe -i C:\Users\test\Desktop\jpg\out -o C:\Users\test\Desktop\jpg\re -S slaver01 -D C:\Users\test\Desktop\DynamoRIO-Windows-8.0.0-1\bin32 -t 9000 -- -coverage_module FreeImage.dll -target_module Project1.exe -target_method test -fuzz_iterations 5000 -nargs 2 -- C:\Users\test\source\repos\Project1\Debug\Project1.exe @@afl-fuzz.exe -i C:\Users\test\Desktop\jpg\out -o C:\Users\test\Desktop\jpg\re -S slaver02 -D C:\Users\test\Desktop\DynamoRIO-Windows-8.0.0-1\bin32 -t 9000 -- -coverage_module FreeImage.dll -target_module Project1.exe -target_method test -fuzz_iterations 5000 -nargs 2 -- C:\Users\test\source\repos\Project1\Debug\Project1.exe @@

因为我的配置比较垃圾只有四核,所以就开这么多了,我们先试一下

扔到ABC看图里,发现真的崩溃了

利用Bugid对Crash分类

这样一堆crash,里面肯定有不少重复的,原因也有各不相同,如何对他们进行快速分类并找到问题点呢?

在这里我使用了BugID,它可以反馈崩溃和死机的可利用性的详细报告,BugID安装所需要的环境如下:

最新的Python 2.7.14Windows的最新调试工具最新的BugId版本

如果使用默认设置安装Windows的Python和调试工具,则BugId应该能够运行而无需调整任何设置。您可以在本地文件系统上任意位置解压缩BugId

但是理论上BugID需要一个一个进行文件分析,而Crash这么多,只是就可以写一个Python脚本来帮助我们

import sysimport ossys.path.append(r"C:\Users\test\Desktop\BugId-master")testcases = []for root, dirs, files in os.walk(r"C:\Users\test\Desktop\jpg\re\slaver01\crashes", topdown=False):    for name in files:        testcase =  os.path.abspath(os.path.join(root, name))        testcases.append(testcase)for testcase in testcases:    print ("[*] Gonna run: ", testcase)    os.system(r"PageHeap.cmd "Project1.exe" ON")    os.system(r"python C:\Users\test\Desktop\BugId-master\BugId.py C:\Users\test\source\repos\Project1\Debug\Project1.exe --isa= x86 -- %s" % testcase)

请注意在最后的程序后面加上--isa= x86哦,不加默认作为64位调试会报错

运行脚本之后,我们就看到源源不断的bug信息出来了

最后可以写到一个文档里保存下来,看起来字符好像有点问题,不过问题不大

这只是简要信息,BugID在运行时已经自动生成了较为详细的分析报告,打开BugID目录就可以看到

随便打开一个看看,很详细

参考文献

winafl使用 http://www.simp1e.site/2020/04/18/winafl/

模糊测试工具WinAFL使用指南 https://www.freebuf.com/articles/system/216437.html

初识 Fuzzing 工具 WinAFL https://paper.seebug.org/323/

Fuzz 工具 WinAFL 的使用感受 https://bbs.pediy.com/thread-255162.htm

Fuzzing the MSXML6 library with WinAFL https://symeonp.github.io/2017/09/17/fuzzing-winafl.html

关键词:

 

热文推荐

环球要闻:WinAFL小白踩坑指南,你学会了吗?

本文主要内容包括:WinAFL介绍与安装、以ABC看图程序为例构建Fuzz最小案例库、执行Fuzz跑出Crash,以及最终

2023-05-04

快讯:IMF:中国将成为今年亚太地区经济增长关键驱动因素

新华社北京5月3日电国际货币基金组织(IMF)日前发布亚太地区经济展望报告,预计2023年亚太地区经济增速为4

2023-05-04

三星“Find my Mobile”功能形同鸡肋,重启未解锁无法锁定位置_最新资讯

IT之家5月4日消息,网友u Minimum-Lemon-402近日在Reddit社区发帖,报告三星“FindmyMobile”服务存在一个

2023-05-04

天天观点:国内旅游收入达1480.56亿元

本报北京5月3日电  (记者王珂、郑海鸥)今年“五一”假期,文化和旅游行业复苏势头强劲,全国假日市场平

2023-05-04

天天微头条丨晚七点到12点兼职-请问 有没有什么兼职工作 晚7点到12点的

1、晚上7-12点当小时工可以去快餐厅、夜场的驻唱歌手、便利店、烧烤店应聘,详细介绍如下:肯德基和麦当劳

2023-05-04

天天观速讯丨陕西商洛:丹凤至山阳高速公路确保今年9月通车

在秦岭深处的陕西商洛,一条东西大通道正在逐渐成型,使沪陕和福银两条高速在这里相连,这就是G4015丹(凤)

2023-05-04

沛嘉医疗-B(09996.HK):5月3日南向资金增持26.24万股 世界看点

5月3日北向资金增持26 24万股沛嘉医疗-B(09996 HK)。近5个交易日中,获南向资金增持的有5天,累计净增持1

2023-05-04

“读书万卷,不过沐猴之冠” 余秀华发微博@史航 对么?_天天观天下

近日,知名编剧史航被多人指控性骚扰一事引起了不小的关注。在事情逐渐发酵后,史航连续两次发声辟谣,称“

2023-05-04

荷媒:阿隆索成热刺重点考察对象 比费耶诺德主帅更有优势-天天热讯

荷兰电讯报的消息指出,热刺已经将选帅目光转投在阿隆索身上。

2023-05-04

今日热讯:dragon怎么读发音_dragon怎么读

1、因为韩文~没有R的音~所以所有的R音~都读L的音~而且韩国人~不习惯引文读法~所以都按照他们韩文的习惯来读

2023-05-04

【新视野】江安县气象台发布大风蓝色预警信号【IV级/一般】【2023-05-03】

江安县气象台2023年05月03日22时10分发布大风蓝色预警信号:预计我县大妙镇、下长镇、仁和镇、阳春镇、大井

2023-05-03

行政公署和人民政府_行政公署_当前滚动

1、目前我国设有行政公署的地区仅黑龙江一个、新疆五个、西藏一个。2、内蒙古有三个盟,也设立行政公署。3

2023-05-03

左卡尼汀的作用和功效_左卡尼汀的作用-环球动态

1、左卡尼汀主要功能是促进脂类代谢,对于肌肉细胞组织的缺血、缺氧,左卡尼汀是其主要能量来源,左尼卡汀适

2023-05-03

拜登哈里斯为竞选筹款活动做准备 全球快看点

据澎湃新闻报导,美国总统拜登和副总统哈里斯正在为最快于下周举行的首次竞选筹款活动做准备。  路透社引

2023-05-03

越南出口再跌17.1%,外贸形势比想象中严峻

越南出口再跌17 1%,外贸形势比想象中严峻,越南,外贸,韩国,出口国

2023-05-03

今天,崇明水陆返程客流较大

今天(5月3日)是“五一”小长假的最后一天,不少人也踏上返程旅途。据悉,5月1日下午开始,G40高速上海长

2023-05-03

禾川科技(688320.SH)股东达晨晨鹰一号等拟合计减持不超9.5%股份

智通财经APP讯,禾川科技(688320 SH)发布公告,公司近日收到股东出具的股份减持计划的告知函,获知公司股东

2023-05-03

中国第五大强省出炉!河南实力领先,福建暂时无缘 世界快报

在过去很长一段时间里,广东、江苏、山东、浙江四大省份的GDP总量稳居我国前四位,也是中国固定的传统四大

2023-05-03

韦世豪晒个人武汉生活照:舒服的城市

直播吧5月3日讯武汉三镇国脚韦世豪更新了个人微博,晒出了自己在武汉的多张生活照。本赛季,韦世豪加盟武汉

2023-05-03

河北港口集团:为祖国升帆 向祖国致敬 焦点速递

中国日报5月3日电2023年4月30日,河北省秦皇岛国际旅游港,帆船爱好者驾驶帆船升起红帆,表达对祖国的敬意

2023-05-03

资讯

北京推出14条秋游文化线路

金秋时节,北京市文化和旅游局以赏银杏品文化为主题,推出14条“叶落的季节——漫步北京赏银杏品文化主题线路”,邀市民和游客以步行、骑行

2021-10-27     
基因编辑发力 培育高质量人源化供体猪

此次人体试验,仅仅验证了基因编辑猪克服异种器官移植的超急性排斥反应,还需解决延迟性排斥反应、消耗性血栓等问题。但通过这次试验,能更

2021-10-27     
中国经济高质量发展步伐稳健 长期向好基本面未变

在全球疫情走势和经济走势趋于复杂的背景下,中国经济巨轮将驶向何方,举世关注。2020年10月26日至29日,党的十九届五中全会在京举行,明确

2021-10-27     
南美解放者杯决赛允许近4.5万观众入场

南美洲足联主席多明格斯25日与今年解放者杯决赛对阵的两支俱乐部负责人会晤,宣布决赛现场观众人数增加到球场容量的75%,即近4 5万人。今年

2021-10-27     
22年从警生涯 面对荣誉他说不要给我报功

9月24日,时任安徽省安庆市公安局迎江分局刑警大队大要案中队中队长周磊因在工作中激烈搏斗引发心源性猝死,倒在了工作岗位上,经医院抢救

2021-10-27     
走近冬奥|五棵松体育中心场馆“黑科技”全面上岗 助力冬

“相约北京”冰球国内测试活动将于2021年11月7日至10日在五棵松体育中心场馆举行,在疫情防控方面,场馆引入了诸多“黑科技”,为防疫安全

2021-10-27