AFL初次尝试
看了一些fuzz的文章但是一直没有做过小的demo,这次算是入门级别的尝鲜。
AFL的安装
安装环境:vm虚拟机、Ubuntu18
- 首先检测LLVM和CLANG是否安装:
sudo apt-get install clang
sudo apt-get install llvm
安装时出现的问题:
E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
解决方案:
ps -e | grep apt
然后执行sudo kill 进程号
- 在目录下下载包:
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命令
选择目标程序
本人采用了网上的简单代码来进行测试
- 创建一个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
- 这里的gcc -g是在编译的时候,生成调试信息,该程序可以被调试器调试。
- 接着建立fuzz_in文件夹,创建输入文件testcase,输入文件中写几个简单单词,fuzzing时会产生变异。
mkdir fuzz_in
echo "hello" > fuzz_in/testcase
- 执行下列语句就开始fuzz了
afl-fuzz -i fuzz_in -o output ./afl_test
结果出错了
解决方案:
$ sudo su
$ echo core >/proc/sys/kernel/core_pattern
- 再次执行下列语句开始fuzz
afl-fuzz -i fuzz_in -o output ./afl_test
- Ctrl+c手动终止fuzz
参考文章,感谢大佬!
https://blog.csdn.net/weixin_50972562/article/details/123379898
https://blog.csdn.net/weixin_39448417/article/details/99703723