想写一个fuzz框架,所以先来读一下著名的fuzz框架AFL的源码
首先看下main函数,关键的部分是下面这三行
1 | find_as(argv[0]); |
首先是find as
as是什么东西呢?
如果了解编译过程,那么就知道把源代码编译成二进制,主要是经过”源代码”->”汇编代码”->”二进制”这样的过程。而将汇编代码编译成为二进制的工具,即为汇编器assembler。Linux系统下的常用汇编器是as。
find_as里面详细的过程这里就不分析了
之后就是edit_params
1 | cc_params = ck_alloc((argc + 128) * sizeof(u8*)); |
首先是分配一块内存空间
然后就是根据argv配置各种东西,包括环境变量的设置
其中看到一些有趣的东西
1 | if (!strcmp(cur, "-fsanitize=address") || |
上网查了下资料,大概就是AFL可以使用sanitizer去更有效的查找memory access bugs
但是同时也会带来性能的下降
最后是 execvp
这里可以打印一下参数
1 | gcc note.c -o www -B /home/test/afl-2.52b -g -O3 -funroll-loops -D__AFL_COMPILER=1 -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1 |
关键的一点就是 -B
1 | -B <directory> Add <directory> to the compiler's search paths |
大概就是汇编器的目录
上面的find_as就是用来找这个的
所以 afl-gcc就是gcc 的一个wraper,用来设置一下gcc的编译选项,还有就是把汇编器换成afl自己实现的一个汇编器