最近打 ctf 的时候感觉有点遇到瓶颈,就来 fuzz 这块看看。
AFL 全称为 American huzzy loop,是 Fuzzing 最高级的测试工具之一。这个工具对有源码和无源码的二进制程序均可以进行 fuzz 测试。
alf 各位自行安装即可,值得注意的是,在我本机 glibc2.31 的环境下,编译 alf 前要对 AFL/llvm_mode/afl-clang-fast.c修改一下,否则会出现报错,只需把部分内容注释掉即可
输入 afl-fuzz 出现下图即安装成功
我们先看对有源码的二进制程序是怎样进行测试:
在 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