AFL源码分析(一) a.alf-gcc.c 1.find_as 这个函数的功能是获取使用的汇编器。首先获取环境变量AFL_PATH,如果这个环境变量存在的话,接着把他和/as拼接,并判断次路径下的as文件是否存在。如果存在,就使得as_path = afl_path = getenv("AFL_PATH")。如果不存在就通过第二种方式尝试获取其路径。首先判断是否存...
1. 关键变量 在开始函数代码分析前,首先要明确几个关键变量: staticu8*as_path;/* Path to the AFL 'as' wrapper,AFL的as的路径 */staticu8**cc_params;/* Parameters passed to the real CC,CC实际使用的编译器参数 */staticu32cc_par_cnt=1;/* Param count, including argv0 ,参数计数 */staticu8...
最后追加-D__AFL_HAVE_MANUAL_CONTROL=1 -D__AFL_COMPILER=1 -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1; 接下来是关于persistent mode相关的设置(该模式我们会在afl-fuzz.c的分析中再展开解释):设置宏__AFL_LOOP(_A)和宏__AFL_INIT(); 检查是否设置了x_set,如果设置则追加-x none参数。 该文件中...
理论上来说应该从编译入手会更递进一些,但是插桩是发生在编译的过程中的,而且AFL的编译内容较多,先了解插桩部分会有助于编译部分的逻辑理解,也符合Fuzz的实际流程。 备注:AFL的源码分析网上已有很多公开文章,文章内容难免会有重合。我们希望大家能在这一系列中融入自己的思考,切实保证自己能体会到AFL的优秀之处。此外,...
以下以clang为例子, 分析静态插桩 AFL的gcc: afl-gcc.c 概述 afl-gcc 是GCC 或 clang 的一个wrapper(封装),在编译要fuzz的程序时, 常用的使用方法是在调用 ./configure 时设置 CC 为afl-gcc 或afl-clang的路径。(对于 C++ 代码,则使用 CXX 并将其指向 afl-g++ / afl-clang++。)afl-clang, afl-clang...
通过分析AFL的源码,发现是AFL在记录程序的执行路径时,最多只记录MAP_SIZE条边。 unsignedintafl_inst_rms = MAP_SIZE; 当执行到被测库libredwg.so时,记录的执行边的数量已经达到了最大值,导致libredwg.so里面的执行路径没有被记录,所以程序的每次执行都会得到一样的覆盖率记录,这也就是AFL一直没有发现新路径的...
在此过程中 AFL 会维护一个语料库队列 queue,包含了初始测试用例及变异后有新状态产生的测试用例,对应的变异操作分为确定性策略和随机性策略两类,而状态的分析,即边界覆盖率的统计工作,需依赖插桩来完成。 图0 afl-fuzz 的实现方案 这里提下插桩,它指的是通过注入探针代...
主要的代码在afl-fuzz.c文件中,然后是几个独立模块的实现代码,llvm_mode和qemu_mode的代码量大致相当,所以分析的重点应该还是在AFL的根目录下的几个核心功能的实现上,尤其是afl-fuzz.c,属于核心中的重点。 各个模块的主要功能和作用的简要说明: 插桩模块 ...
__afl_maybe_log作为插桩代码所执行的实际内容,会在接下来详细展开,这里我们只分析"movl $0x%08x, %%ecx\n"这条指令。 回到fprintf()命令: fprintf(outf, use_64bit ? trampoline_fmt_64 : trampoline_fmt_32, R(MAP_SIZE)); 1 2 可知R(MAP_SIZE)即为上述指令将ecx设置的值,即为。根据定义,MAP_SIZE...
AFL二三事——源码分析 前言 AFL,全称“American Fuzzy Lop”,是由安全研究员Michal Zalewski开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率(代码执行路径的覆盖情况),以此进行反馈,对输入样本进行调整以提高覆盖率,从而提升发现漏洞的可能性。AFL可以针对有源码和无源码的程序...