-
-
[翻译]使用AFL进行fuzz
-
发表于:
2019-4-19 00:39
12398
-
回顾早期的软件漏洞,在攻防之间的较量相当精彩。现在IT公司和安全实验室会使用强大的Fuzz工具寻找软件缺陷或挖掘漏洞。新防御技术提出的同时,反防御技术也随之出现。在这篇文章中,我们将了解软件漏洞利用的整个过程:从使用American Fuzzy Lop(AFL)来进行fuzz,到使用gdb-peda和pwntools调试编写漏洞利用脚本。为此,我们编写一个有明显缓冲区溢出漏洞的64位程序,然后对其进行fuzz,找到漏洞,分析结果,并为其编写漏洞利用脚本。这里也提供了视频资源。
我们使用Ubuntu64位系统,通过以下命令即可成功安装AFL:
虽然可以在网上找一个有漏洞的程序,但为了完全了解细节,我们还是自己写一个简单的C程序。这个程序使用了2个字符串缓冲区,每个缓冲区的长度为32字节,分别用于存放username
和password
。为了获取用户输入,我们使用不安全的gets()函数,它不会去检查边界,这会导致缓冲区溢出。
执行该程序,会要求输入username
和password
。输入被存放到login
和passwd
变量中。然后使用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/
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-7-28 22:39
被qux编辑
,原因: 未知原因,链接变成不存在附件形式,做相关修改