AFL入门学习<AFL 下载和安装>

AFL入门学习<AFL 下载和安装>

FUZZ:Fuzzing技术是一种基于黑盒(或灰盒)的测试技术,通过自动化生成并执行大量的随机测试用例来发现产品或协议的未知漏洞。随着计算机的发展,Fuzzing技术也在不断发展。
AFL:American fuzzy lop 号称是当前最高级的Fuzzing 测试工具之一,由谷歌的Michal Zalewski 所开发。通过对源码进行重新编译时进行插桩(简称编译时插桩)的方式自动产生测试用例来探索二进制程序内部新的执行路径。与其他基于插桩技术的fuzzers 相比,afl-fuzz 具有较低的性能消耗,有各种高效的fuzzing 策略和tricks 最小化技巧,不需要先行复杂的配置,能无缝处理复杂的现实中的程序。
①从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);
②选择一些输入文件,作为初始测试集加入输入队列(queue);
③将队列中的文件按一定的策略进行“突变”;
④如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;
⑤上述过程会一直循环进行,期间触发了crash的文件会被记录下来。

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

wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz
tar xvf afl-latest.tgz
cd afl-2.52b
sudo make && sudo make install
安装完成后,默认在/usr/local/bin/目录下,修改.bashrc加入环境变量export PATH=/usr/local/bin:$PATH后即可使用

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

#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char login[32];
    char passwd[32];
 
    printf("Login: \n");
    gets(login);
    printf("Password: \n");
    gets(passwd);
 
    if (strcmp(login, "root") == 0) {
        if (strcmp(passwd, "1qazxsw2") == 0) {
            printf("Access Granted.\n");
            return 0;
        }
    }
 
    printf("Access Denied.\n");
    return 1;
}

执行该程序,会要求输入username和password。输入被存放到login和passwd变量中。然后使用strcmp()和正确的值比较,如果输入值为"root"和"1qazxsw2",控制台会输出"Access Granted.“,否则输出"Access Denied.”。
我们使用afl-gcc编译器来构建目标程序。AFL编译器会在源码周围添加代码,最大限度地扩大覆盖率。使用以下命令进行编译:

afl-gcc -fno-stack-protector -z execstack vuln1.c -o vuln1
-fno-stack-protector 该选项会禁止stack canary保护
-z execstack 允许堆栈可执行

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

username无效;
username有效,但password无效;
username和password都有效。
创建3个文件作为测试用例来覆盖3条路径,每个文件都包含2行。如下:

| test1.txt | test2.txt | test3.txt |
| --------- | --------- | --------- |
| a         | root      | root      |
| a         | a         | 1qazxsw2  |

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

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

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

	echo core > /proc/sys/kernel/core_pattern

使用以下命令开始fuzz:

	
afl-fuzz -i ./testcases/ -o ./results/ ./vuln1

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值