如果拥有受测试程序的源代码,可以使用静态插桩技术来实现覆盖率的记录和增强,这一功能被AFL项目命名为llvm mode,具体实现方式是借助LLVM的Pass来更改中间代码表示IR(Intermediate Representation),从而在编译过程中实现插桩。 在有源代码的情况下,可以使用 AFL 自带的...
afl命令 afl-gcc 和afl-g++ 分别对应的是gcc 和g++ 的封装 可以编译文件,并在源文件中添加特殊指令用于 afl fuzz 编译插装 afl-clang 和afl-clang++ 分别对应clang 的c 和c++ 编译器封装À。 afl-fuzz 是AFL 的主体,用于对目标程序进行fuzz。 afl-analyze 可以对用例进行分析,通过分析给定的用例,看能否发现...
接下来使用 CC=/home/error404/AFL/afl-gcc ./configure --disable-shared make clean all 进行编译,可以看到afl-gcc确实被执行了,并且编译出的程序存在AFL桩代码 PS:为了方便调试,我的afl-gcc添加了一些打印参数的语句,使用官方仓库时的回显可能与此处不同。 0x04 后记 虽然网上有很多关于AFL源码的分析,但是绝...
$ gcc test.c -o test 然后使用如下命令开始fuzzing: $ afl-fuzz -i input -o out -Q ./test 熟悉的界面:
之后输入以下命令进行安装2.AFL测试 下载一个有缺陷的c文件使用afl-gcc/afl-clang 编译生成一些种子语料库开始fuzz提示修改/proc/sys/kernel/core_pattern再次运行之前的代码可看到fuzz进度现在就表示我们的ACL已经安装成功了,注意出现(odd,check syntax!)是表示样例根本没有进入到测试中去,需要调整语料库。
能够发现此时在/usr/local/bin目录下,安装了很多AFL的相关命令。 afl-analyze:用来对用例进行分析,发现其中有意义的字段。 afl-clang++:相当于c++的编译器的封装。 afl-fuzz:AFL主体,用于对目标程序进行fuzz。 afl-gcc:相当于gcc的封装。 afl-plot:生成模糊测试任务的状态图。
之后输入以下命令进行安装 2.AFL测试 下载一个有缺陷的c文件 使用afl-gcc/afl-clang编译 生成一些种子语料库 开始fuzz 提示修改/proc/sys/kernel/core_pattern 再次运行之前的代码可看到fuzz进度 现在就表示我们的ACL已经安装成功了,注意出现(odd,check syntax!)是表示样例根本没有进入到测试中去,需要调整语料库。
命令。 0x03 afl-gcc实例分析 使用CC=/home/error404/AFL/afl-gcc ./configure生成的Makefile与使用./configure生成的Makefile对比,主要有以下区别: 此时我们可以修改afl-gcc.c用来打印出cc_params的内容 打印出内容后,可以看到afl-gcc按我们上文所预期的那样添加了部分参数。 gcc -DHAVE_CONFIG_H -I. -g -...
之后输入以下命令进行安装 2.AFL测试 下载一个有缺陷的c文件 使用afl-gcc/afl-clang 编译 生成一些种子语料库 开始fuzz 提示修改/proc/sys/kernel/core_pattern 再次运行之前的代码可看到fuzz进度 现在就表示我们的ACL已经安装成功了,注意出现(odd,check syntax!)是表示样例根本没有进入到测试中去,需要调整语料库。
afl-gcc插桩分析 考虑到afl的插桩方式随编译器的选择而变化,从最简单的afl-gcc开始入手。 先把一个简单程序用afl-gcc编译,代码来源(https://github.com/mykter/afl-training) #include<string.h>#include<stdio.h>#include<unistd.h>#include<stdlib.h>#defi...