首页
社区
课程
招聘
[翻译]使用AFL进行fuzz
发表于: 2019-4-19 00:39 12401

[翻译]使用AFL进行fuzz

2019-4-19 00:39
12401

回顾早期的软件漏洞,在攻防之间的较量相当精彩。现在IT公司和安全实验室会使用强大的Fuzz工具寻找软件缺陷或挖掘漏洞。新防御技术提出的同时,反防御技术也随之出现。在这篇文章中,我们将了解软件漏洞利用的整个过程:从使用American Fuzzy Lop(AFL)来进行fuzz,到使用gdb-pedapwntools调试编写漏洞利用脚本。为此,我们编写一个有明显缓冲区溢出漏洞的64位程序,然后对其进行fuzz,找到漏洞,分析结果,并为其编写漏洞利用脚本。这里也提供了视频资源

我们使用Ubuntu64位系统,通过以下命令即可成功安装AFL:

虽然可以在网上找一个有漏洞的程序,但为了完全了解细节,我们还是自己写一个简单的C程序。这个程序使用了2个字符串缓冲区,每个缓冲区的长度为32字节,分别用于存放usernamepassword。为了获取用户输入,我们使用不安全的gets()函数,它不会去检查边界,这会导致缓冲区溢出。

执行该程序,会要求输入usernamepassword。输入被存放到loginpasswd变量中。然后使用strcmp()和正确的值比较,如果输入值为"root"和"1qazxsw2",控制台会输出"Access Granted.",否则输出"Access Denied."。

我们使用afl-gcc编译器来构建目标程序。AFL编译器会在源码周围添加代码,最大限度地扩大覆盖率。使用以下命令进行编译:

-fno-stack-protector 该选项会禁止stack canary保护
-z execstack 允许堆栈可执行

生成的目标程序会用于下文的fuzz。

fuzz的一个关键点是创建好的测试用例,通过分析目标程序的所有潜在路径来最大化输入的覆盖率。vuln1程序很简单,只有3条路径:

创建3个文件作为测试用例来覆盖3条路径,每个文件都包含2行。如下:

AFL会读取每个文件的内容,将每一行输入到vuln1的标准输入中。创建一个名为testcase的目录,并在其中创建3个表示这些情况的文件。文件名并不重要。

创建3个文件之后,再创建一个和testcase同级的名为results的目录,该目录会保存fuzz结果。

最后一步准备工作:切到root用户,修改core_pattern文件内容为core

使用以下命令开始fuzz:

开始fuzz之后,右上角的uniq crashes会很快出现变化,当total paths到达3时,已经达到了我们想要的效果。使用Ctrl-C终止程序。在真实环境下,我们一般无法知道一共有多少种路径,AFL提供颜色变化来帮助你判断是否已有结果。最需要关注的就是uniq crashes,如果它的值不为0,表明已经有输入导致了程序崩溃,在results/crashes文件夹里存有相应文件:

每个id开头的文件都包含使程序崩溃的输入,这样就可以复现崩溃,并查看崩溃是否可以利用,以下命令展示了简单的复现:

这篇文章介绍了AFL并fuzz了一个简单的程序。AFL是一个强大的fuzz工具,可用于源代码和二进制文件的漏洞查找,这通常是发现漏洞的第一步。

原文:http://thecyberrecce.net/2017/03/20/software-exploit-development-fuzzing-with-afl/


[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

最后于 2019-7-28 22:39 被qux编辑 ,原因: 未知原因,链接变成不存在附件形式,做相关修改
收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 30
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
最近也在研究fuzz,哥们有兴趣交流一下么
2019-7-26 17:25
0
雪    币: 13284
活跃值: (5898)
能力值: ( LV5,RANK:77 )
在线值:
发帖
回帖
粉丝
qux
3
GoLwhy 最近也在研究fuzz,哥们有兴趣交流一下么
抱歉,只是翻译,后来没有深入接触
2019-7-28 22:40
0
游客
登录 | 注册 方可回帖
返回
//