1.AFL的安装

先安装gcc,我的虚拟机还没装。

//先安装gcc 
sudo apt-get install gcc
//查看gcc版本看是否安装成功
gcc -v

之后发现还需要clang和llvm,要啥装啥吧。

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

下载AFL,开始愉快地安装,很快啊。

git clone https://github.com/google/AFL
cd AFL
make
//如果显示make command not found 运行下面两条命令
apt install make
apt upgrade

2.AFL测试

我根据网上的教程,直接输入afl -fuzz 显示找不到afl命令,那就直接测试一个具体的文件试试。

创建一个testfile文件夹,然后在该文件夹下创建测试文件afl_test.c,内容如下:

#include <stdio.h> 
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>

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

显示如下

image-20221013210725121

于是我又试了命令apt install afl

重新尝试,

image-20221013211737042

接着建立fuzz_in文件夹,创建输入文件testcase,输入文件中写几个简单单词,fuzzing时会产生简单变异。

mkdir fuzz_in
echo "hello" > fuzz_in/testcase

进行fuzz,结果如图。

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

image-20221013212507389

3.基于编译器的目标程序插桩

3.1下载目标程序集(coreutils-9.1.tar.gz)

wget https://ftp.gnu.org/gnu/coreutils/coreutils-9.1.tar.gz
tar -zxvf coreutils-9.1.tar.gz

3.2使用afl-gcc,生成coreutils的每个二进制程序

  • 查看 coreutils 的 configure 选项,指定 cc=afl-gcc

    ./configure CC=afl-gcc

    这一步用来生成Makefile,为了下一步编译做准备,可以通过在configure后面加参数进行控制。

    可以通过 ./configure --help查看帮助

    问题

    image-20221014112413555

    通过百度找到解决方案

    export FORCE_UNSAFE_CONFIGURE=1
  • 生成 coreutils 二进制程序集。make 出来的每一个插桩后二进制均在 coreutils-9.1/src 目录下

    make

3.3为 coreutils 的特定程序确定输入种子

coreutils 包含很多二进制程序,任选其中程序进行 fuzzing。

构造输入种子列表,存放于coreutils-9.1/src/input 目录下,构造方法可以选择:

  • 学习 coreutils 文档中这 3 个程序的命令行选项,用这些命令行选项构建

  • 直接用随机构造的任意字符串作为输入种子。

    mkdir input
    mkdir output
    cp ../../AFL/dictionaries/* ./input # 将字典拷贝到input目录下

3.4在coreutils-9.1/src 目录下,使用 afl-fuzz -i input -o output ./[程序名] @@进行fuzzing,一段时间后终止fuzzing 并在 coreutils-9.1/src/output 目录下查看测试结果。

image-20221014113912837