AFL++ 安装
AFL(American Fuzzy Lop)是由安全研究员 Michał Zalewski 开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具
AFL++ 除了继承AFL的功能外,还添加了以下功能:
- 并行测试:允许在多个处理器核心上运行测试,以加速测试过程
- 基于云的测试:将测试工作负载部署到云服务器上,以节省本地资源
- 自适应测试:根据目标程序的复杂性和测试历史来调整测试策略,以提高测试效果
安装依赖:
1 | sudo apt-get update |
安装 AFL++:
1 | git clone https://github.com/AFLplusplus/AFLplusplus && cd AFLplusplus |
- 如果版本过高可以去下载老版本:Release 3.14c · AFLplusplus/AFLplusplus (github.com)
protobuf && libprotobuf
Protocol Buffers 是一个开源的序列化协议,用于将数据结构序列化为二进制格式,以便在网络上传输和使用
1 | wget https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/protobuf-cpp-3.14.0.zip |
- PS:新版本的 Protocol Buffers 需要 g++14 的支持
libprotobuf 是 protobuf 库的 C++ 实现,在 afl-libprotobuf-mutator 的 build 脚本中会自动安装 libprotobuf(同样需要 g++14 的支持)
afl-libprotobuf-mutator 安装
afl-libprotobuf-mutator 是一个模糊测试工具,用于对基于 Protocol Buffers 协议编写的程序进行模糊测试,它是一个基于AFL(American Fuzzy Lop)的扩展,专为 Protocol Buffers 提供了一种特殊的模糊测试方法
- Protocol Buffers 是一种轻量级数据交换格式,用于序列化和反序列化结构化数据
- afl-libprotobuf-mutator 允许您使用 AFL 的随机测试用例来攻击基于 Protocol Buffers 的程序,从而找到潜在的错误和漏洞
在测试过程中,afl-libprotobuf-mutator 将自动为 Protocol Buffers 消息生成随机 mutations,并将其传递给目标程序,AFL 将分析目标程序的行为并报告潜在的错误
1 | git clone https://github.com/thebabush/afl-libprotobuf-mutator.git |
在开始编译前需要修改 build.sh 以降低 libprotobuf 对 g++ 版本的需求:
1 | !/bin/bash |
然后检查 afl-libprotobuf-mutator/src/mutator.cc
的 AFLPlusPlus 接口是否匹配(若不匹配可以直接修改函数名)
最后开始编译:
1 | cd afl-libprotobuf-mutator |
- 在当前工作路径下将会生成
dumper
,libmutator.so
,mutator
三个文件
protobuf_ctf_fuzz 安装
protobuf_ctf_fuzz 是一个大佬制作的 ctf fuzz 工具,项目地址如下:
我们只需要将 protobuf_ctf_fuzz/kp_src
中的 mutator.cc
文件拷贝到 afl-libprotobuf-mutator/src
中,再次编译 afl-libprotobuf-mutator 即可
使用 afl-libprotobuf-mutator
protobuf 代码编写完成后,覆盖保存至 afl-libprotobuf-mutator/gen/out.proto
,路径必须完成一致,若遇到重名文件 out.proto 则直接替换
喂入 AFL 的 testcase 必须是 protobuf bin 格式的数据,即需要事先用 afl-libprotobuf-mutator/dumper
将明文输入转换为 protobuf bin 格式的数据
这里的 dumper.cc 需要根据 out.proto 进行编写(按照 protobuf_ctf_fuzz/kp_src/dumper.cc
中的模板进行修改即可)
重新编译 afl-libprotobuf-mutator 后使用如下命令启动:
1 | mkdir workdir |