AFL-Fuzz 的使用
- 一、工具
- 二、有源码测试
- 三、无源码测试
一、工具
建议安装LLVM并使用afl-clang-fast或afl-clang-lto进行编译,这些工具提供了更现代和高效的插桩技术。您可以按照以下步骤安装LLVM和afl-clang-fast:
sudo apt update
sudo apt install llvm
wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz
tar -xf afl-latest.tgz
cd afl-<version>
make
sudo make install
二、有源码测试
在分析前,先创建两个文件夹,fuzz_in 和 fuzz_out。
fuzz_in 里面再创建个 txt 文件,里面输入一点字母即可。
还有一点,核心转储的问题。
sudo su
echo "core" > /proc/sys/kernel/core_pattern
exit
源码示例
#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-clang-fast -g test.c -o test
运行结果如下:
接下来,我们开始模糊测试:
afl-fuzz -i fuzz_in -o fuzz_out -- ./test
运行结果如下:
红框是我们要关注的地方,如果cycles的颜色变绿了,说明测试的差不多了,可以 ctrl+c 中断掉了。比如下图:
我们查看 fuzz_out 文件夹的 crashes 文件夹。
三、无源码测试
你会发现 AFL 的 qemu-mode 有非常多的问题。这边建议不用折腾 AFL了,直接下载ALF++。
git clone https://github.com/AFLplusplus/AFLplusplus.git
cd AFLplusplus
make all
然后,进入 qemu-mode 文件夹,运行 build 脚本。
cd qemu-mode
./build_qemu_support.sh
运行完,还得回到上级目录,也就是 AFLplusplus,然后运行 sudo make install。
cd ../
sudo make install
再测试案例的时候,别用上面插过桩的可执行文件。重新用 gcc 编译生成,记得 fuzz_out 要换个文件夹。
运行如下,等待变绿吧。
afl-fuzz -i fuzz_in -o fuzz_out_2 -Q ./afl_test2