AFL++安装
学习fuzzing也几天了,今天记录AFL++的安装及使用
一、实验环境
虚拟机:ubuntu20.04

当然也可以uname -a去看自己的版本号
二、AFL++安装
1.先更新一下工具
sudo apt update
2.安装AFL++必要的一些依赖,例如编译工具(如 build-essential)、Python 开发环境、自动化构建工具(如 automake)。
sudo apt install -y build-essential python3-dev automake cmake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools cargo libgtk-3-dev
在过程中我开始遇到被2954进程占用,如下图

这个进程是管包更新的。我本来准备kill这个进程,但过了一会他便好了

3.克隆AFL++仓库
git clone https://github.com/AFLplusplus/AFLplusplus.git
克隆好后去下方的文件夹
cd AFLplusplus

4.编译安装AFL++
我开始make all指令后,出现下面问题

遇到的错误是因为缺少 GCC 插件开发头文件,于是我开始安装。先下面看gcc的版本号
gcc -v | head -n1

然后安装gcc插件包
sudo apt install gcc-9-plugin-dev
# 若版本是 12.x,改为:
# sudo apt install gcc-12-plugin-dev

安装完事后,再重新编译AFL++
make clean # 清理旧编译文件(可选)
make # 重新执行编译

同时,我也将其安装到系统,使其可以全局使用
sudo make install

5.检测AFL++是否安装成功
afl-fuzz --help

到这AFL++安就安好了
三、安装VScode
这不是重点,我们快速带过
安装命令如下
sudo apt update
sudo apt install software-properties-common apt-transport-https wget
# 添加微软签名密钥
wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/microsoft.gpg
# 添加 VS Code 软件源
sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main"
# 安装 VS Code
sudo apt install code
启动命令如下:
code

四、使用AFL++
4.1 实验准备
我们先编写一个test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char buffer[100];
if (argc > 1) {
strcpy(buffer, argv[1]);
printf("You entered: %s\n", buffer);
}
return 0;
}
这里很明显可以看出缓冲器漏洞
回顾一下平常我们怎么启用
gcc test.c -o test
#其中,test.c是源文件名,-o test指定生成的可执行文件名为test
./test xxx
#./test就可以启动test.exe,后面xxx可以输进去东西

4.2 工具测试
**1.编译目标程序。**使用 AFL++ 提供的编译器包装器 afl-clang-fast 或 afl-gcc 来编译目标程序,以便在运行时收集模糊测试所需的信息。这里以 afl-clang-fast 为例:
afl-clang-fast -g -o test test.c

遇到一个问题,安一下afl-clang-fast
sudo apt install afl++-clang

再执行就OK了

2.创建基础文件
模糊测试需要一些初始的输入数据作为测试的起点。创建一个包含简单输入的文件
mkdir in
echo "Hello" > in/test_input
mkdir out

3.启动模糊测试
使用 afl-fuzz 命令启动模糊测试,指定输入目录、输出目录和要测试的目标程序:
afl-fuzz -i in -o out ./test @@
-i in:指定包含初始输入文件的目录。
-o out:指定用于存储模糊测试结果的输出目录。
./test @@:指定要测试的目标程序,@@ 是 AFL++ 的占位符,表示在运行目标程序时将自动替换为生成的输入文件。
执行遇到一个小问题

从你给出的错误信息可知,系统当前的 core_pattern 配置会致使在捕获程序崩溃时出现延迟,从而影响 AFL++ 的正常运行。AFL++ 建议你修改 /proc/sys/kernel/core_pattern 的配置
我们在这个框临时解决一下
echo core | sudo tee /proc/sys/kernel/core_pattern
该命令的作用是把 /proc/sys/kernel/core_pattern 的值设定为 core,如此一来,系统在产生核心转储文件时就不会借助外部工具,从而避免了延迟问题。
不过,这种修改仅在当前会话中有效,系统重启之后配置会恢复原状。
再执行:

就产生下面的运行结果图:

还有

啊,为什么没crashes。求教大佬
(感谢指导)
现在更正本节第三小点
3.启动模糊测试
使用 afl-fuzz 命令启动模糊测试,指定输入目录、输出目录和要测试的目标程序,这里没有文件输入,不需要@@占位:
afl-fuzz -i in -o out ./test
这样才会有crashes
下面是另一个代码的实验结果:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
int AFLTest(char *str)
{
int len = strlen(str);
if(str[0] == 'A' && len == 6)
{
raise(SIGSEGV);
//如果输入的字符串的首字符为A并且长度为6,则异常退出
}
else if(str[0] == 'F' && len == 16)
{
raise(SIGSEGV);
//如果输入的字符串的首字符为F并且长度为16,则异常退出
}
else if(str[0] == 'L' && len == 66)
{
raise(SIGSEGV);
//如果输入的字符串的首字符为F并且长度为66,则异常退出
}
else
{
printf("it is good!\n");
}
return 0;
}
int main(int argc, char *argv[])
{
char buf[10]={0};
gets(buf);
//存在栈溢出漏洞
printf(buf);
//存在格式化字符串漏洞
AFLTest(buf);
return 0;
}
输入命令:
afl-clang-fast -g -o test2 test2.c
afl-fuzz -i fuzz_in -o out ./test2
(-g 是一个编译选项,它主要用于在编译过程中向生成的可执行文件中嵌入调试信息,-g不写也可以运行)
结果如下,可见crashes:

此外,我在探索时发现,还有命令可以提高crashes数量
export AFL_USE_ASAN=1
afl-clang-fast -fsanitize=address -o test test.c
afl-fuzz -i fuzz_in -o out ./test

看到下面state:finished后,你就可以ctrl+c结束了,然后
cd out/default/crashes
ls
xxd id.....#id.....表示crashes文件夹里的文件

里面可以分析结果
也可以到test.exe的目录下,启动exe输入crashes里面的值,复现漏洞
更多推荐

所有评论(0)