Last updated on:April 18, 2023 am

AFLGO是基于AFL改进而来的一种定向灰盒模糊测试工具。定向Fuzz的鼻祖(之一)。

AFLGo基于llvm实现了函数调用图CG和控制流图CFG的获取,结合对程序CG/CFG定义了一种基于目标distance衡量的种子调度策略,使得Fuzzer能够更快生成可抵达目的位置的测试用例。定向灰盒模糊测试(Directed Greybox Fuzzing)常常用于补丁测试,漏洞复现等等具备特定待测目标的软件测试任务场景。

1 安装AFLGO

  • 安装llvm和clang,官方文档要求是3.8或者4.0,经过自己测试6.0和11.0和也可以使用,确保环境$PATH或$LLVM_CONFIG变量已经添加
  • 执行官方一键安装脚本,此脚本疑似有问题(截止至2020年10月),其中llvm-4.0和clang-4.0会安装失败
  • 因此依照官方README的流程,我编写了一键安装llvm 12.0.1以及AFLGo的脚本
curl https://gitee.com/QGrain/aflgo-build/raw/master/aflgo-build.sh | bash
docker pull qgrain/aflgo:ubuntu20.04_llvm12.0.1

2 使用AFLGO

可能遇到的问题:

  • 计算distance:gen_distance_fast.py不好用,建议用genDistance.sh。此外如果报错AttributeError: module 'networkx' has no attribute 'info',则卸载networkx然后安装低版本
pip uninstall networkx
pip install networkx==2.2

3 常见开源库和软件

Google已经总结了三百多款常见的开源软件用于模糊测试,每一个工具的目录结构如下:

/PATH/TO/TOOL
│─ build.sh
│─ Dockerfile
│─ project.yaml
└─ my-api-repo
│─ do_stuff_fuzzer.cpp
│─ do_stuff_fuzzer.dict
│─ do_stuff_unittest.cpp
│─ Makefile
│─ my_api.cpp
│─ my_api.h
│─ README.md
│─ standalone_fuzz_target_runner.cpp
└─ do_stuff_test_data
│─ 410c23d234e7f97a2dd6265eb2909324deb8c13a
│─ 7a74862169c3375f4149daff75187cbca7372a38

并不是所有的工具都提供了相关的代码和语料,但是每一款工具都给出了

  • project.yaml:记录了项目基本信息,例如:
homepage: "https://www.gnu.org/software/binutils/"
language: c++
primary_contact: "bug-binutils@gnu.org"
auto_ccs :
  - "p.antoine@catenacyber.fr"
  - "nickc@redhat.com"
  - "amodra@gmail.com"
  - "david@adalogics.com"
fuzzing_engines:
  - libfuzzer
  - afl
  - honggfuzz
  - dataflow
sanitizers:
  - address
  - undefined
  - memory
  - dataflow
  • Dockerfile:定义实验环境容器
  • build.sh:用于构建实验环境容器

撰写了一个脚本解析出了所有支持afl引擎的开源工具列表:

binutils brotli brunsli bzip2
c-ares capstone cjson cmark
graphicsmagick grok harfbuzz
hermes hostap
jbig2dec json-c
lcms libcbor libexif libfdk-aac libidn2 libldac libpcap libplist libspectre libtasn1 libteken libwebp libxml2 libyaml libyuv lz4
miniz monero mupdf
nanopb ndpi nestegg nghttp2 ntp
openjpeg openthread opus ots
pcre2 pffft proxygen
qubes-os
rnp
speex stb
tidy-html5 tor tremor
unicorn usrsctp
vorbis
wireshark woff2 wolfssl wuffs
xz
yajl-ruby
zlib zlib-ng zstd

然后选取了其中较为常用,轻量级的几款工具来做AFLGO Fuzzing测试

3.1 bzip2

3.2 binutils

3.3 cJSON

3.4 libpcap

4 参考文档

AFLGO官方README

值得推荐的C/C++开源框架和库

开源软件分类列表

软件分类-开源中国OSCHINA


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

常见开源软件和开源库的调用关系 Previous
AFL简介与使用 Next

 TOC

载入天数... 载入时分秒...