AFL——American Fuzzy Lop的基础使用
因为某些奇怪的原因,我一个没搞过pwn的得来搞代码fuzz,只好学一下,顺便记一下。
AFL的安装
在部分源有的情况下可以直接使用apt-get install安装
或者开启docker直接使用
或者传统安装
wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz
tar xvf afl-latest.tgz
cd afl-2.52b #根据自己下载的版本进行替换
make && make -C llvm_mode CXX=g++
make install
AFL内含工具
AFL提供了许多工具
常用的有
·afl-gcc#gcc与g++编译
·afl-clang#clang对于c与c++的封装编译器
·afl-tmin#简化缩小输入例
·afl-cmin#同上
·afl-showmap#对文件进行执行path跟踪
·afl-analyze#对输入列进行分析,查找有用的字段
基础使用事例
首先我们先随便写个程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
int crash(char *str)
{
int len = strlen(str);
if(str[0] == 'O' && len == 8)
{
raise(SIGSEGV);
}
else
printf("noting happened!\n");
return 0;
}
int main(int argc, char *argv[])
{
char buf[10]={0};
gets(buf);//栈溢出
printf(buf);//格式化字符串漏洞
printf("\n");
crash(buf);
return 0;
}
格式化字符串漏洞和栈溢出就不多说了,我个搞web的都有了解,更别说专门搞pwn的了。
为了更加的方便去理解,还写了个crash函数,如果输入的字符串,首字母为O且长度为8,那么就会抛出错误。
对程序进行编译插桩
将刚才的文件保存为test.c
afl-gcc test.c
instrumented 那一行出现就说明编译插桩成功
我们还得将输出改一下,不让他输出到特定的处理程序,而是将coredumps输出为文件,好让我们后期利用。
在使用kali2020的时候,因为默认没有root权限,建议提前输入sudo -s进入超级管理员模式。
sudo -s
echo core > /proc/sys/kernel/core_pattern
对输出的a.out文件进行测试
我们可以使用echo命令传参给他
echo "hello" |./a.out
再试试构造一个会crash的字符串
echo "OOOOOOOO" |./a.out
成功报错
对程序进行FUZZ测试
我们先创建两个文件夹
mkdir in out
然后我们在in文件夹中创建一个包含 hello的文件
然后我们就可以进行fuzz测试啦
afl-fuzz -i in -o out -- ./a.out
看到旁边标红的uniq crashes就是我们想要的结果
感觉跑了差不多了,就可以自己ctrl c停下来了。
进入out文件夹,再进入crashes文件夹
我们就可以看见跑出来的crash记录ng)
cat一下,看一下其中的内容。
其中一个和我们要构造的差不多
这应该就是AFL使用的一个基本过程了。