如果拥有受测试程序的源代码,可以使用静态插桩技术来实现覆盖率的记录和增强,这一功能被AFL项目命名为llvm mode,具体实现方式是借助LLVM的Pass来更改中间代码表示IR(Intermediate Representation),从而在编译过程中实现插桩。 在有源代码的情况下,可以使用 AFL 自带的...
1.源码编译插桩:使用 afl++ 自带的插桩编译器:afl-gcc(还有很多其他的插桩编译器现以这个举例) [AFL++ 405757f4e3c5] ~/work/test2 # afl-gcc ./test2.c -o ./stackoverflow afl-cc++4.22a by Michal Zalewski, Laszlo Szekeres, Marc Heuse - mode: ...
接下来是 afl 的编译,分成两个部分 gcc 编译部分和 llvm 模式,首先来介绍 gcc 部分。 afl-gcc 1. 文件描述 afl-gcc是gcc的一个wrapper,能够实现对一些关键节点进行插桩,利用插桩代码来记录程序的执行路径等信息。该文件的主要作用是进行源码编译,并在编译前对输入的参数进行处理。 2. 文件架构 文件涉及的头文件...
如果拥有受测试程序的源代码,可以使用静态插桩技术来实现覆盖率的记录和增强,这一功能被AFL项目命名为llvm mode,具体实现方式是借助LLVM的Pass来更改中间代码表示IR(Intermediate Representation),从而在编译过程中实现插桩。 在有源代码的情况下,可以使用 AFL 自带的 afl-gcc 或 afl-clang 插桩方式,这些工具通过修改 ...
如果拥有受测试程序的源代码,可以使用静态插桩技术来实现覆盖率的记录和增强,这一功能被AFL项目命名为llvm mode,具体实现方式是借助LLVM的Pass来更改中间代码表示IR(Intermediate Representation),从而在编译过程中实现插桩。 在有源代码的情况下,可以使用 AFL 自带的 afl-gcc 或 afl-clang 插桩方式,这些工具通过修改 ...
afl-gcc 是GNU as 的一个wrapper(封装),唯一目的是预处理由 GCC/clang 生成的汇编文件,并注入包含在 afl-as.h 中的插桩代码。 使用 afl-gcc / afl-clang 编译程序时,工具链会自动调用它。该wapper的目标并不是为了实现向 .s 或asm代码块中插入手写的代码。 experiment/clang_asm_normalize/ 中可以找到可能...
afl-as是AFL使用的汇编器,这里做成wrapper主要目的是为了进行插桩,AFL的插桩逻辑都在该文件中完成,而桩代码位于afl-as.h头文件中。 2. 文件架构 文件涉及的头文件调用关系如下: 与前面的afl-gcc.c文件基本相同,但多了对afl-as.h的包含,此外还多了几个与时间和进程相关的头文件。
虽然这两种模式都非常不错,但需注意他们只支持afl-clang-fast编译器,不支持afl-gcc和afl-clang编译器(PS 这些编译器只是 AFL 实现的 GCC 和 Clang 的包装器,增加了一些特定的编译选项,最终真正执行编译工作的还是 GCC 和 Clang)。他们在插桩方式上,也是完全不同的。前者使用Clang编译器,结合后端LLVM的Pass框架实...
GCOV,它随gcc一起发布,所以不需要再单独安装,和afl-gcc插桩编译的原理一样,gcc编译时生成插桩的程序,用于在执行时生成代码覆盖率信息 LCOV,它是GCOV的图形前端,可以收集多个源文件的gcov数据,并创建包含使用覆盖率信息注释的源代码HTML页面。 这里也可以使用apt-install afl-cov来安装,不过看网上建议这个版本实际使用...
GCOV,它随gcc一起发布,所以不需要再单独安装,和afl-gcc插桩编译的原理一样,gcc编译时生成插桩的程序,用于在执行时生成代码覆盖率信息 LCOV,它是GCOV的图形前端,可以收集多个源文件的gcov数据,并创建包含使用覆盖率信息注释的源代码HTML页面。 这里也可以使用apt-install afl-cov来安装,不过看网上建议这个版本实际使用...