标签:pat 添加 准备 print 文件 out 搜索路径 这一 本质
在使用AFL时,需要先通过afl-gcc/afl-clang等工具编译目标程序(在这个过程中对目标进行插桩)。
编译过程:源代码-->汇编代码-->二进制。
源代码-->汇编代码:这一步是通过
汇编代码-->二进制:这一步是通过汇编器(assembler)。Linux中常用的汇编器是as。
//在AFL_PATH路径中找到假的GNU汇编器(即afl-as),或者从argv[0]中找到位置。如果失败,则发生中断。
find_as(argv[0]);
//把argv的内容复制给cc_params(这个参数后面会传递给真实的cc)。
edit_params(argc, argv);
//execvp函数的第一个参数是要执行的文件名,第二个参数是参数列表。
execvp(cc_params[0], (char**)cc_params);
afl-gcc本质上是gcc的wrapper。
gcc的-B 设置了搜索路径。
AFL代码插桩是在源文件编译成汇编代码后通过afl-as进行的。
大致逻辑:处理汇编代码,在分支处插入插桩代码,然后调用as进行真正的汇编。
具体插入代码的部分:
fprintf(outf, use_64bit ? trampoline_fmt_64 : trampoline_fmt_32, R(MAP_SIZE));
fprintf()将格式化的字符串添加到汇编代码的合适位置。
格式化的字符串分为32位和64位两种情况(具体定义在afl-as.h头文件中,主要是汇编代码)。
标签:pat 添加 准备 print 文件 out 搜索路径 这一 本质
原文地址:https://www.cnblogs.com/Ricardio/p/14318932.html