试验环境

本次实验通过远程连接到华为云Flexus应用服务器L实例,系统使用Ubuntu 22.04 server 64bit

在服务器上安装AFL++

image.png

**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

对afl_test进行测试,创建输入输出文件夹:fuzz_in和fuzz_out,用来存放程序的输入和fuzz的输出结果

image.png

准备开始对这个有漏洞的c文件进行模糊测试

image.png