- unit:执行单元测试(基于cmocka)
- help:显示这些构建选项
编译选项
STATIC - 编译 AFL++ 静态
CODE_COVERAGE - 编译代码覆盖率目标(请参阅 docs/instrumentation/README.llvm.md)
ASAN_BUILD - 使用内存清理程序编译 AFL++ 以进行调试
UBSAN_BUILD - 使用未定义的行为清理程序编译 AFL++ 工具以进行调试
DEBUG - 无优化、-ggdb3、所有警告和 -Werror
LLVM_DEBUG - 显示 llvm 弃用警告
PROFILING - 使用分析信息编译 afl-fuzz
INTROSPECTION - 使用突变内省编译 afl-fuzz
NO_PYTHON - 禁用 python 支持
NO_SPLICING - 禁用 afl-fuzz 中的剪接突变,不建议用于正常模糊测试
NO_UTF - 不要在状态屏幕中使用 UTF-8 进行线条渲染(回退到普通 AFL 的 G1 框绘图)
NO_NYX - 禁用构建 nyx 模式依赖项
NO_CORESIGHT - 禁用构建 coresight(仅限arm64)
NO_UNICORN_ARM64 - 禁用在arm64上构建独角兽
AFL_NO_X86 - 如果在非 intel/amd 平台上编译
LLVM_CONFIG - 如果您的发行版不使用 llvm-config 的标准名称(例如 Debian)
AFL++使用
测试目标及其说明
- Binary-only: fuzzing_binary-only_targets.md
- GUI programs: best_practices.md#fuzzing-a-gui-program
- Libraries: frida_mode/README.md
- Network services: best_practices.md#fuzzing-a-network-service
- Non-linux: unicorn_mode/README.md
选择测试目标
例如: Cisco RV130 VPN 路由器的固件:https://software.cisco.com/download/home/285026141/type/282465789/release/1.0.3.55?i=!pp
该文件名为RV130X_FW_1.0.3.55.bin
使用binwalk提取二进制文件,jsonparse和xmlparser1二进制文件进行模糊测试,由于没有源码,所以需要使用qemu模式
例如:
TP-Link SR20路由器的固件,固件的下载地址如下:https://static.tp-link.com/2018/201806/20180611/SR20(US)_V1_180518.zip
$ binwalk -Me tpra_sr20v1_us-up-ver1-2-1-P522_20180518-rel77140_2018-05-21_08.42.04.bin
了解目标接受的输入
qemu-arm-static和 --help 参数运行xmlparser1会显示用法
我们可以创建一个测试 XML 文件并运行xmlparser1。
收集语料库
对于基于变异的模糊测试工具而言,需要为其准备一个或多个起始的输入案例,这些案例通常能够很好的测试目标程序的预期功能,这样我们就可以尽可能多的覆盖目标程序。
收集语料的来源多种多样。通常目标程序会包含一些测试用例,我们可以将其做位我们初始语料的一部分,此外互联网上也有些公开的语料库你可以收集他们做为你的需要。
关于语料库的主动性选择,这个更多需要你对fuzzing 目标内部结构的了解。例如你当你要fuzzing的目标对随着输入的规模内存变化非常敏感,那么制作一批很大的文件与较小的文件可能是一个策略,具体是否是否有效取决于你经验、以及对目标的理解。
此外,需要注意控制语料库的规模,太过庞大的语料库并不是好的选择,太过潘达的语料库会拖慢fuzzing的效率,尽可能用相对较小的语料覆盖更多目标代码的预期功能即可。
一些常见的在线样本集
https://files.fuzzing-project.org/
http://samples.ffmpeg.org/
http://lcamtuf.coredump.cx/afl/demo/
https://github.com/MozillaSecurity/fuzzdata
https://github.com/strongcourage/fuzzing-corpus
https://github.com/Cisco-Talos/clamav-fuzz-corpus
https://github.com/mozilla/pdf.js/tree/master/test/pdfs
https://github.com/codelibs/fess-testdata
https://github.com/google/honggfuzz/tree/master/examples/apache-httpd
精简语料库
在AFL++中可以使用工具afl-cmin从语料库中去除不会产生新路径和覆盖氛围的重复输入,并且AFL++官方提示强烈建议我们对语料库唯一化,这是一个几乎不会产生坏处的友谊操作。
具体的使用如下:
- 将收集到的所有种子文件放入一个目录中,例如 INPUTS。
- 运行 afl-cmin:
# 如果要通过模糊测试来调用目标程序 bin/target INPUTFILE ,请将目标程序将从中读取的 INPUTFILE 参数替换为 @@
afl-cmin -i INPUTS -o INPUTS_UNIQUE -- bin/target -someopt @@
# 如果目标从 stdin(标准输入)读取,只需省略 , @@ 因为这是默认值:
afl-cmin -i INPUTS -o INPUTS_UNIQUE -- bin/target -someopt
构建输入输出文件
需要自行构建输入文件夹:用来存储初始种子,即将上述种子存到一个文件夹中
需要构建输出文件夹:用来存储测试反馈与记录
运行AFL++
如果程序从 stdin 读取,afl-fuzz请像这样运行:
./afl-fuzz -i seeds_dir -o output_dir -- \
/path/to/tested/program [...program's cmdline...]
要添加字典,请添加-x /path/to/dictionary.txt到 afl-fuzz。
如果程序从文件获取输入,则可以将其放入@@程序的命令行中;AFL++ 将为您放置一个自动生成的文件名。
以上面目标为例:
$ QEMU_LD_PREFIX=./squashfs-root/ /home/iot/tools/AFLplusplus/afl-fuzz -Q -i squashfs-root/bmp-input/ -o squashfs-root/bmp-output/ -- ./squashfs-root/usr/bin/bmp2tiff @@ /dev/null # root权限下
# -Q:适用qemu模式
# -i:输入文件夹
# -o:输出文件夹
# @@:表示将用来替换的样本
# /dev/null:忽略错误信息
或
$ QEMU_LD_PREFIX=./squashfs-root/ ../AFLplusplus/afl-fuzz \
-Q \
-i input-xml/ \
-o output-xml/ \
-- ./squashfs-root/usr/sbin/xmlparser1 -f @@
双连字符 (–) 之后的所有内容都指定要与其参数一起运行的目标程序。@@ 参数代表文件名。在运行时,AFL++ 会将@@ 参数替换为输入文件的名称。
结果分析
输出目录会有结果信息
触发崩溃的两个文件位于/default/crashes目录中。
可以进一步重复执行造成crash的种子
总结
AFL++作为一个覆盖率引导的模糊测试工具,拥有自己的变异算法,由于其使用广泛,因此相关教程及实验资料较多,学习使用的曲线平滑,并且其目前更新频率较高,对LLVM的支持以及各类Sanitizer的支持也使得其能更快的发现更多的漏洞。
其对于闭源应用程序(使用-Q参数开启QEMU模式)和有源码的应用程序都可以进行FUZZING,但是对于复杂的程序会碰见路径爆炸或执行速度较慢的问题,后者可以通过AFL++的持久模式来进行加速,此时需要使用者对被测程序拥有一定的了解(可能涉及到逆向和源码修改的问题)。
参考资料
https://mp.weixin.qq.com/s/0xqYOP-MSS4PmRrJJ6Acqw
https://mp.weixin.qq.com/s/jXztoXqdox-th5LxpWdMnQ
https://mp.weixin.qq.com/s/vNEVdwaLeIKvGm8JPgfduw
https://mp.weixin.qq.com/s/752lYRaCcaF-9I2ErvapiQ
https://mp.weixin.qq.com/s/kyt4JkZlmxBBiVfFVqYY2g
https://github.com/AFLplusplus/AFLplusplus
https://mp.weixin.qq.com/s/Bw8xoaeeqrRdvK2ZZisC1A
先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
需要这份系统化资料的朋友,可以点击这里获取
822)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新