0%

结构化fuzz工具

AFL++ 安装

AFL(American Fuzzy Lop)是由安全研究员 Michał Zalewski 开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具

AFL++ 除了继承AFL的功能外,还添加了以下功能:

  • 并行测试:允许在多个处理器核心上运行测试,以加速测试过程
  • 基于云的测试:将测试工作负载部署到云服务器上,以节省本地资源
  • 自适应测试:根据目标程序的复杂性和测试历史来调整测试策略,以提高测试效果

安装依赖:

1
2
3
4
sudo apt-get update
sudo apt-get install -y build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools
sudo apt-get install -y lld-11 llvm-11 llvm-11-dev clang-11 || sudo apt-get install -y lld llvm llvm-dev clang
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-dev

安装 AFL++:

1
2
3
4
git clone https://github.com/AFLplusplus/AFLplusplus && cd AFLplusplus
export LLVM_CONFIG="llvm-config-11"
make distrib
sudo make install

protobuf && libprotobuf

Protocol Buffers 是一个开源的序列化协议,用于将数据结构序列化为二进制格式,以便在网络上传输和使用

1
2
3
4
5
6
7
8
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/protobuf-cpp-3.14.0.zip
unzip protobuf-cpp-3.14.0.zip
cd protobuf-3.14.0
./autogen.sh
./configure
make -j8
sudo make install
sudo ldconfig
  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

git clone https://github.com/google/libprotobuf-mutator.git
cd libprotobuf-mutator
git checkout e33a10c9db21244f6e27f13b4df02c72cc625573
cd ..
sed -i "/CONFIGURE_COMMAND/a \ \ \ \ \ \ \ \ -DCMAKE_NO_SYSTEM_FROM_IMPORTED=TRUE" libprotobuf-mutator/cmake/external/protobuf.cmake
mkdir -p external
mkdir -p build

pushd build
cmake ../libprotobuf-mutator -DLIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF=1 -DCMAKE_INSTALL_PREFIX=../external/ -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_CXX_FLAGS="-fPIC"
make -j 12
make install
popd

mkdir -p ./external/bin ./external/include ./external/lib/
cp -r ./build/external.protobuf/include/* ./external/include
cp ./build/external.protobuf/bin/protoc ./external/bin/

然后检查 afl-libprotobuf-mutator/src/mutator.cc 的 AFLPlusPlus 接口是否匹配(若不匹配可以直接修改函数名)

最后开始编译:

1
2
cd afl-libprotobuf-mutator
./build.sh && make
  • 在当前工作路径下将会生成 dumperlibmutator.somutator 三个文件

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
2
3
4
5
6
7
8
9
mkdir workdir
mkdir workdir/fuzz_input

export AFL_CUSTOM_MUTATOR_ONLY=1
export AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1
export AFL_CUSTOM_MUTATOR_LIBRARY=/home/yhellow/Tools/afl-libprotobuf-mutator/libmutator.so
export AFL_USE_QASAN=1

afl-fuzz -i workdir/fuzz_input -o workdir/fuzz_output -Q -- ./pwn