通过 protobuf + AFLplusplus 进行传统 ctf fuzz。
请参考这篇博文 来了解具体细节。
注意:该程序为学习时所编写,运行可能不太稳定,如果在使用过程中存在问题,请优先尝试使用 GDB 调试或审计代码来解决。
最好在有 AFL 研究基础的情况下去玩耍该项目。
介于 AFL-fuzz++ 的快速迭代,新版的 AFL-fuzz++ 可能对该项目不支持。请使用 2021年10月左右 版本的 AFL-fuzz++
构建很简单,只需一行命令即可:
网络一定一定一定要好!!!
否则还是一条一条的粘贴 ./build.sh 中的命令运行,确保每条命令都成功吧(笑)
sudo ./build.sh
构建好后,将自定义 protobuf 放入 kp_src/out.proto
中,同时修改对应的 kp_src/mutate.cc
以及 kp_src/dump.cc
,最后执行以下脚本以更新被修改的部分:
source ./pre_run.sh
每次修改完
kp_src/
文件夹下的代码后,或者新开一个终端准备跑 fuzz 前,均需执行./pre_run.sh
。
之后自己准备 workdir 以及 fuzz_input,然后跑以下命令以启动 fuzz:
语料的准备,或许可以修改
kp_src/dumper.cc
并借助afl-libprotobuf-mutator/dumper
来生成。
# 此时工作目录为:protobuf_ctf_fuzz/
AFLplusplus/afl-fuzz -i workdir/fuzz_input -o workdir/fuzz_output -Q -- <CTF_path>
根目录下的 babyheap
文件作为例子用的 CTF 题目,其 protobuf 描述以及对应的 dumper 和 mutate 代码已经预置于 kp_src
中。
- libprotobuf-mutator 的变异效果一般,最好手动改进一下
- 需要实现一下 trim 逻辑,防止样例爆炸