最近打 ctf 的时候感觉有点遇到瓶颈,就来 fuzz 这块看看。

AFL 全称为 American huzzy loop,是 Fuzzing 最高级的测试工具之一。这个工具对有源码和无源码的二进制程序均可以进行 fuzz 测试。

alf 各位自行安装即可,值得注意的是,在我本机 glibc2.31 的环境下,编译 alf 前要对 AFL/llvm_mode/afl-clang-fast.c修改一下,否则会出现报错,只需把部分内容注释掉即可

fuzz——AFL基础使用方法-LMLPHP

输入 afl-fuzz 出现下图即安装成功

fuzz——AFL基础使用方法-LMLPHP

我们先看对有源码的二进制程序是怎样进行测试:

在 AFL 文件夹里会有很多目录,我们进入 test。首先先把自己要测试的源码放进去,再建两个文件夹分别放测试输入的内容和测试输出的内容,我这里就建了 fuzz_in , fuzz_out。在fuzz_in 里面还要建一个文件,里面随便放一些字母就行(这里笔者也不是很清楚为什么)。在有源码的情况下我们用 afl 自带的编译器,对其进行编译这会使测试更加高效。原因是 afl 自带的编译器在编译时会对目标程序插桩,故此过程叫插桩编译。我从其他师傅的博客里找了一个简单的二进制程序来进行测试。

#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;
}
02-14 09:20