本次实验通过远程连接到华为云Flexus应用服务器L实例,系统使用Ubuntu 22.04 server 64bit
在服务器上安装AFL++
**AFL++**可以作为一个独立的工具运行,不需要对源代码进行修改。它通过插桩技术来监控程序的执行,以此来引导测试用例的生成。
进行标准的有源码fuzz,使用一个有漏洞的c代码程序afl_test.c作为测试对象。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
int AFLTest(char *str)
{
int len = strlen(str);
if(str[0] == 'C' && len == 8)
{
raise(SIGSEGV);
//如果输入的字符串的首字符为C并且长度为6,则异常退出
}
else if(str[0] == 'F' && len == 20)
{
raise(SIGSEGV);
//如果输入的字符串的首字符为F并且长度为16,则异常退出
}
else if(str[0] == 'L' && len == 66)
{
raise(SIGSEGV);
//如果输入的字符串的首字符为L并且长度为66,则异常退出
}
else
{
printf("it is good!\\n");
}
return 0;
}
int main(int argc, char *argv[])
{
char buf[100]={0};
gets(buf);
//存在栈溢出漏洞
printf(buf);
//存在格式化字符串漏洞
AFLTest(buf);
return 0;
}
为方便后续实验gcov进行 覆盖率分析,使用以下命令生成afl_test
afl-clang-fast -g -fprofile-arcs -ftest-coverage afl_test.c -o afl_test
fprofile-arcs
:生成用于追踪代码覆盖率的附加信息。ftest-coverage
:生成用于后续分析的文件(例如 .gcda
文件)。g
:包含调试信息,方便 gcov
提供更详细的报告。对afl_test进行测试,创建输入输出文件夹:fuzz_in和fuzz_out,用来存放程序的输入和fuzz的输出结果
准备开始对这个有漏洞的c文件进行模糊测试