afl-gcc.c
全局变量
as_path:保存as文件路径,AFL的as是对clang assembler的包装
cc_params:u8类型的二维数组,保存全部parse完毕后的AFL_PARAMS
函数
find_as:查找AFL_PATH路径下的afl-as文件,未找到报fatal退出
edit_params:根据main函数传入的argv解析AFL的调用参数,如AFL_CXX、AFL_CC路径,此处也获取了AFL_GCJ并有说明,如果你安装了GCJ和Eclipse,那么AFL可以在java上工作,但是对于没有handler的异常,AFL需要作修改去处理Java binaries非0的退出crash
main:afl-gcc的入口函数,通过调用find_as、edit_params确定文件和参数,通过execvp函数运行afl-g++、afl-gcc或afl-gcj
afl-as.c
as程序是AFL对clang assembler的包装,主要在链接阶段对目标程序“插桩”,“插桩”的汇编代码在afl-as.h中,在插桩过程中,首先要保持原有程序流程现场,其实现如下。
插桩代码中保存寄存器现场的实现
static const u8* trampoline_fmt_32 =
"\n"
"/* --- AFL TRAMPOLINE (32-BIT) --- */\n"
"\n"
".align 4\n"
"\n"
"leal -16(%%esp), %%esp\n" //将栈顶抬高16个字节
"movl %%edi, 0(%%esp)\n"