有两种静态插桩方式:llvm mode,汇编层面插桩。 如果拥有受测试程序的源代码,可以使用静态插桩技术来实现覆盖率的记录和增强,这一功能被AFL项目命名为llvm mode,具体实现方式是借助LLVM的Pass来更改中间代码表示IR(Intermediate Representation),从而在编译过程中实现插桩...
有两种静态插桩方式:llvm mode,汇编层面插桩。 如果拥有受测试程序的源代码,可以使用静态插桩技术来实现覆盖率的记录和增强,这一功能被AFL项目命名为llvm mode,具体实现方式是借助LLVM的Pass来更改中间代码表示IR(Intermediate Representation),从而在编译过程中实现插桩。 在有源代码的情况下,可以使用 AFL 自带的 afl-g...
AFL 的插桩思路是通过编写 pass 来实现 tuple 信息的记录,在此过程中会对每一基本块都插入探针,具体代码在 afl-llvm-pass.so.cc 文件。而初始化和 forkserver 操作则通过链接完成,afl-llvm-rt.o.c 文件实现了 afl-as.h 中 main_payload 的这部分功能: 图8 clang...
如果找到,拼接$afl_path/afl-llvm-rt.o,并确定可以访问,然后把该路径赋值给obj_path; 如果获取失败,找最后一个/,提取其 dir ,然后拼接成$dir/afl-llvm-rt.o,并确定可以访问,然后把该路径赋值给obj_path。 afl-llvm-rt.o由afl-llvm-rt.o.c编译获得,我们在后面会介绍该文件,这就是运行时库。 4. edit...
AFL LLVM_Mode中存在着三个特殊的功能。这三个功能的源码位于afl-llvm-rt.o.c中。 deferred instrumentation AFL会尝试通过仅执行一次目标二进制文件来优化性能。它会暂停控制流,然后复制该“主”进程以持续提供fuzzer的目标。该功能在某些情况下可以减少操作系统、链接与libc内部执行程序的成本。
如果读取成功,确认AFL_PATH/afl-llvm-rt.o是否可以访问;如果可以访问,设置该目录为obj_path,然后直接返回; 如果读取失败,检查arg0中是否存在/字符,如果存在,则判断最后一个/前面的路径为 AFL 的根目录;然后读取afl-llvm-rt.o文件,成功读取,设置该目录为obj_path,然后直接返回。 如果上面两种方式都失败,到/usr/...
其代码逻辑如下此外,对于LLVM插桩,跟随afl-llvm-rt.o.c查看LLVM Pass层次的实现代码,实际上可以发现,很多内容都是用c来表示的,但功能和先前的汇编差不多,比如插桩比例的控制:又比如forkserver与父进程的等待和通信,这些内容将会在接下来进行详细叙述。 在没有源代码的情况下进行插桩,被称为唯二进制插桩 (Binary-...
afl-llvm-rt.o.c 文件主要是重写了 afl-as.h 文件中的 main_payload 部分,方便调用; afl-llvm-pass.so.cc 文件主要是当通过 afl-clang-fast 调用 clang 时,这个pass被插入到 LLVM 中,告诉编译器添加与 `afl-as.h 中大致等效的代码; afl-clang-fast.c 文件本质上是 clang 的 wrapper,最终调用的还是 ...
AFL 的插桩思路是通过编写 pass 来实现 tuple 信息的记录,在此过程中会对每一基本块都插入探针,具体代码在 afl-llvm-pass.so.cc 文件。而初始化和 forkserver 操作则通过链接完成,afl-llvm-rt.o.c 文件实现了 afl-as.h 中 main_payload 的这部分功能: 图8 clang 编译参数设置 最后提下 qemu 模式,AFL...
需要下载cfe-3.5.2 llvm-3.5.2 clang-tools-extra-3.5.2 compiler-rt-3.5.2 1、xz -d 解压 这些文件 2、tar xvf 解压上一步解压出来的4个tar文件 3、整合 mv cfe-3.5.2.src clang mv clang llvm-3.5.2.src/tools mv clang-tools-extra-3.5.2.src extra ...