小白初学AFL(American Fuzzy Lop)

有幸从一位师哥那里知道这个软件,但是由于实习刚刚结束,终于有时间一探当前最为强大而有效的漏洞挖掘技术。
首先我的电脑系统是WINDOWS10,而AFL支持的是Linux系统,当然大家如果不想安装双系统或者是虚拟机,可以下载WINAFL:下载地址
我正好想更熟悉Linux系统就下了个虚拟机,开始了我的探索旅程。

安装AFL

在指定目录下检查LLVM和CLANG是否安装:

sudo apt-get install clang
sudo apt-get install llvm

LLVM是一个自由软件项目,它是一种编译器基础设施,以C++写成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。
Clang(发音为/ˈklæŋ/类似英文单字clang) 是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。 它采用了LLVM作为其后端,而且由LLVM2.6开始,一起发布新版本。
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。 这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。
apt-get,是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。

在目录下下载包:

wget http://lcamtuf.coredump.cx/afl/releases/afl-2.52b.tgz
tar -zxvf afl-2.52b.tgz
cd afl-2.52b
make
sudo  make install

这时候输入afl -fuzz发现可以使用这个命令编译了:
小白初学AFL(American Fuzzy Lop)_第1张图片

选择目标程序

接下来我就要考虑用目标程序来测试了。
由于我是新手,我就先选择网上一些简单的代码来进行检测:代码出处

#include  
#include  
#include  
#include  
#include  

int vuln(char *str)
{
    int len = strlen(str);
    if(str[0] == 'A' && len == 66)
    {
        raise(SIGSEGV);
        //如果输入的字符串的首字符为A并且长度为66,则异常退出
    }
    else if(str[0] == 'F' && len == 6)
    {
        raise(SIGSEGV);
        //如果输入的字符串的首字符为F并且长度为6,则异常退出
    }
    else
    {
        printf("it is good!\n");
    }
    return 0;
}

int main(int argc, char *argv[])
{
    char buf[100]={0};
    gets(buf);//存在栈溢出漏洞
    printf(buf);//存在格式化字符串漏洞
    vuln(buf);

    return 0;
}

对此代码进行编译:

afl-gcc -g -o afl_test test.c

插桩:在AFL编译文件时候afl-gcc会在规定位置插入桩代码,可以理解为一个个的小断点(但是没有暂停功能),在后续fuzz的过程中会根据这些桩代码进行路径探索,测试等。使得测试覆盖面更广,更全面。
-o:指定生成的输出文件;

编译成功后如下图所示:
小白初学AFL(American Fuzzy Lop)_第2张图片
接着建立一个testcase的文件夹,建立一个几个字母的文件,然后可以在终端输入:

afl-fuzz -i testcase -o output ./afl_test

接下来我终于进入了它的UI界面:
小白初学AFL(American Fuzzy Lop)_第3张图片
然后我等了大概十五分钟,一个Crash都没跑出来,原博主只花了分钟。我寻思着我以前破解hash我的电脑花了8小时,别人的花了2小时,不知道是不是和这个有关系…

今天就先到这里了,以后再继续理解重要概念和AFL背后的原理。

你可能感兴趣的:(读书笔记)