安装
AFL简介:一个面向安全的模糊程序,采用新型的编译时工具和遗传算法来自动发现干净、有趣的测试用例,从而触发目标二进制文件中的新内部状态。
准备
Ubuntu 20.04
Target Platform:x86_64 and arm64
必备软件包:
make/build-essential
sudo apt-get install build-essential make
下载AFL包
https://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz
AFL快速安装
- 编译AFL使用 make
- 找到或编写一个相当快的、简单的程序,从文件或stdin中获取数据,以适合测试的方式进行处理,然后退出
- 编译程序 /library去进行模糊测试 使用afl-gcc
CC=/path/to/afl-gcc CXX=/path/to/afl-g++ ./configure --disable-shared
make clean all
4.获取一个小的但是有效的输入文件,对程序有意义
5.如果这个程序从标准输入流进行读取,运行afl-fuzz就像
./afl-fuzz -i testcase_dir -o findings_dir -- \
/path/to/tested/program [...program's cmdline...]
如果这个项目从一个文件里获取输入,你能用@@在这个命令行中
6.通过及时查阅文档来调查模糊器界面用户中显示为红色的任何东西
注意:如果出现了以下情况
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B5ablS6H-1648625174936)(https://note.youdao.com/yws/res/33313/WEBRESOURCE82c44f88556a2a873616345d20063b06)]
需要对操作系统核心转储进关闭
sudo su
echo core >/proc/sys/kernel/core_pattern
exit
使用
创建一个测试案例文件 afl_test.c
#include <stdlib.h>
#include <signal.h>
void test (char *buf) {
int n = 0;
if(buf[0] == 'a') n++;
if(buf[1] == 'f') n++;
if(buf[2] == 'l') n++;
if(buf[3] == '!') n++;
printf("%d\n",n);
if(n == 4) {
printf("awesome!\n");
raise(SIGSEGV);
}else{
printf("wrong!\n");
}
}
int main(int argc, char *argv[]) {
char buf[100];
test(argv[1]);
return 0;
}
使用 afl-gcc进行编译
afl-gcc -g -o test test_afl.c
使用afl-fuzz进 fuzzing测试
afl-fuzz -i fuzz_in -o fuzz_out ./afl_test @@
其中两个@@表示占位符 (因为源程序中需要在运行中有相应的字符串输入),以及需要创建fuzz_in,用来存放初始的种子和 fuzz_out最终得到的crash
最终得到如图所示的AFL运行结果:
(https://note.youdao.com/yws/res/33321/WEBRESOURCE9c334341f7a79679061c90b6d3c3a61b)]