文章目录
- 一、Fuzzing基本知识
- 1、什么是Fuzzing?
- 2、Fuzzing运行流程
- 二、Fuzzing实战
- 1、下载AFL压缩包
- 2、安装AFL
- 3、Fuzzing
一、Fuzzing基本知识
1、什么是Fuzzing?
维基百科将模糊测试定义为:
模糊测试 (fuzz testing, fuzzing)是一种软件测试技术。其核心思想是将自动或半自动生成的随机数据输入到一个程序中,并监视程序异常,如崩溃,断言(assertion)失败,以发现可能的程序错误,比如内存泄漏。模糊测试常常用于检测软件或计算机系统的安全漏洞。
也就是说,Fuzzing是用随机数据来测试程序。
2、Fuzzing运行流程
下面主要从AFL的运行流程来更好理解Fuzzing的执行流程:
1).对源代码进行编译,并进行插桩,以记录代码覆盖率;
2).选择一些输入文件,作为初始输入,也就是初始种子;
3).一般是以队列方式,选择种子池中的种子;
4).按照一定的变异策略,对选中的种子进行变异,生成多个新的种子;
5).用变异生成的种子对编译好的程序进行测试;
- 如果该种子能够增加代码覆盖率,则保存到种子池中,进行下一次变异;
- 如果该种子导致程序崩溃,则保存起来,方便之后查看为什么导致程序崩溃。
6).在测试若干轮之后,可能会保存有造成程序崩溃的种子,现在就是去分析它为什么导致崩溃的时候了!
下图是AFL的流程图:
二、Fuzzing实战
该部分主要使用AFL进行Fuzzing练习😍😍😍
1、下载AFL压缩包
AFL官方网址AFL
2、安装AFL
解压压缩包后,进入到AFL的解压目录
make
sudo make install
注意解压命令:
tar -zxvf afl-2.52b.tgz
make
后的终端显示:
make install
后的终端显示:
在终端输入afl-fuzz
,能出现如下图所示界面,说明安装成功。
3、Fuzzing
(1)测试代码
#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;
}
(2)准备初始种子
- afl_test:保存初始种子,一个文件,里面随便写点内容,如‘aaaa’;
- fuzz_in:种子池,变异后有用的种子会保存到该目录下;
- fuzz_out:记录引发崩溃的种子样本,以及其他样本。
(3)编译上述源代码
输入命令afl-gcc -g -o ./afl-test/afl-test ./afl-test/testcase.c
注:testcase.c就是刚刚用于测试的源代码,./afl-test/afl-test用于保存编译后得到的文件
编译后,文件目录情况:
(4)准备Fuzzing
使用命令afl-fuzz -i fuzz_in -o fuzz_out ./afl-test/afl-test
按照提示,在命令行输入
echo core >/proc/sys/kernel/core_pattern
然后重新输入afl-fuzz -i fuzz_in -o fuzz_out ./afl-test/afl-test
下面是执行结果:
have a nice day ! 😃😃😃
(4)查看崩溃种子
下面是fuzz_out目录下保存的结果,崩溃种子保存在crash目录下。
使用xxd id:000001,sig:11,src:000002,op:havoc,rep:128
命令可以查看种子。
后续工作就是分析种子了,会用到汇编知识,速成篇只能学到这儿了😭😭😭