作者:chenkaij_305 | 来源:互联网 | 2023-08-15 17:56
一、AFL安装(注:实验环境为Ubuntu64位)第一步,安装Clang.Clang是一个高度模块化开发的轻量级编译器,编译速度快、占用内存小、有着友好的出错提示。在使用AFL编译
一、AFL安装
(注:实验环境为Ubuntu 64位)
第一步,安装Clang. Clang是一个高度模块化开发的轻量级编译器,编译速度快、占用内存小、有着友好的出错提示。在使用AFL编译时,实践表明afl-clang-fast相较于afl-gcc会更高效。
第二步,安装LLVM. 可以认为LLVM是一个完整的编译器架构,也可以认为它是一个用于开发编译器、解释器相关的库。且在使用LLVM架构的时候,Clang其实大致上对应到编译器的前端,主要处理一些和具体机器无关的针对语言的分析操作;编译器的优化器部分和后端部分就是LLVM后端。LLVM Mode模式编译程序也可以获得更快的Fuzzing速度。
第三步,安装AFL. 网上关于下载AFL的方法有很多,如果无法使用sudo apt-get install xx的方法,也可以通过下载AFL源码包,然后解压使用。
第四步,查看是否安装成功。 出现以下界面,则说明安装成功,版本号为2.52b。
二、AFL测试
(一)了解AFL [^1]
AFL(American Fuzzy Lop)是由安全研究员Michał Zalewski(@lcamtuf)开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。其工作流程大致如下:
①从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);
②选择一些输入文件,作为初始测试集加入输入队列(queue);
③将队列中的文件按一定的策略进行“突变”;
④如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;
⑤上述过程会一直循环进行,期间触发了crash的文件会被记录下来。
(二)测试步骤 [^2]
1、进入到要测试的源文件的所在文件目录中。
2、使用CC=afl-clang-fast来编译源文件,并进行插桩。
3、核心转储。在执行afl-fuzz前,如果系统配置为将核心转储文件(core)通知发送到外部程序。 将导致将崩溃信息发送到Fuzzer之间的延迟增大,进而可能将崩溃被误报为超时,所以得临时修改core_pattern文件。
4、设置合适的输入样例input来提高效率。AFL将这个作为种子然后变异生成其他测试样例。[ 也可以省略这一步,AFL自动生成输入样例 ]
5、常规格式:afl-fuzz -i input -o out /path/to/program [params]
out文件则是由AFL自动生成,用来存放crash、queue等内容。
6、没有什么错误,Fuzzer就正式开始工作了。首先,对输入队列中的文件进行预处理;然后给出对使用的语料库可警告信息;最后,开始Fuzz主循环,显示状态窗口。
*上图为执行刚开始
*上图为执行24分钟以后
*上图为执行10小时以后
7、当队列中的所有文件都经过变异测试了,则完成一次"cycle done"。而可以结束的依据就是当右上角cycles done字段的数字颜色由洋红变为橙色,最后变为绿色时,说明测试已经差不多了,则按下Ctrl+C来终止测试。
(三)Crash分析
查看out文件目录里面的crashs文件夹。
共有8个crash。将每个crash带入源代码运行后,共有如下几类错误:
①段错误(核心已转储)
②堆栈粉碎
③输入不符合格式要求导致输出错误
三、难点及解决方法
问题一:AFL生成的out文件不可访问(提示权限不够)
解决方法:sudo chmod 777 out -R(设置此目录下所有文件可读可写)
问题二:crash文件为二进制文件,没有直接打开的可用软件
解决方法:利用vim/cat可查看
四、总结心得
刚开始接触AFL时,由于关于安装和测试的一些经验贴比较少,所以走了不少弯路。很多帖子中测试到的bug,现如今已被修复,后续再测也找不到可挖掘之处。然,学习了一段时间后,越发觉得AFL的一些强大之处,很多大神灵活利用AFL测试,也是非常厉害。抱着继续学习的心态,找到了这个GitHub上的一个实验项目,感觉挺适合AFL测试的入门练手,便测试了其中一道题来学习一番,总不至于跑了几个小时没有收获:)
参考文献:
[^1] AFL漏洞挖掘技术漫谈(一):用AFL开始你的第一次Fuzzing
https://www.freebuf.com/articles/system/191543.html
[^2] 测试源代码来自:Exercises to learn how to fuzz with American Fuzzy Lop
https://github.com/mykter/afl-training