【AFL++代码详解】简易使用教程

本文详细介绍了如何在WindowsWSL环境中手动编译并安装AFL++,包括使用llvm模式、编译libxml2库进行插桩,以及配置AFL++进行fuzzing的过程,还推荐了使用tmux保持fuzzing会话持续运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何使用 AFL++

本章节主要内容为简单介绍如何使用 AFL++ 来 fuzz 开源软件,大部分内容来自于 Build and install AFL++ 以及 Fuzzing libxml2 with AFL++

本章节仅介绍手动编译安装的步骤,图快的话直接用 docker 镜像,环境都配好了,开箱即用。

编译 AFL++

首先从 github 上直接拉取源码最新版本,本人电脑是 Windows,使用的是 WSL 的环境。

git clone https://github.com/AFLplusplus/AFLplusplus
cd AFLplusplus

AFL++ 有很多编译选项,最简单的方式就是直接编译所有选项。但这里我们使用 AFL++ 推荐的 llvm 模式,需要先安装 llvm。

sudo apt-get install llvm clang

然后编译 AFL++ 的源码模式

make source-only

在这里插入图片描述

编译成功后,如果想要使用方便的话可以直接 sudo 安装。也可以不安装,每次用绝对路径使用就行了

sudo make install

编译源码

libxml2 库为例,fuzz 前需要先对源码进行编译插桩。首先

git clone https://gitlab.gnome.org/GNOME/libxml2.git
cd libxml2

如果是新环境,需要安装一些必要的库

sudo apt-get install autoconf pkgconf automake libtool m4 python3 python3-dev

用 configure 配置编译环境等,这里关闭动态库的编译,是因为插桩需要插桩到静态库中静态链接才能正常运行

./autogen.sh
./configure --enable-shared=no

配置环境变量,这里设置同时插桩ASAN

export AFL_USE_ASAN=1

使用 AFL++ 的 clang wapper 来编译

make CC=~/AFLplusplus/afl-clang-fast CXX=~/AFLplusplus/afl-clang-fast++ LD=~/AFLplusplus/afl-clang-fast

在这里插入图片描述

编译好 libxml2 以后,使用其中一个程序 xmllint 来进行fuzz

$ mkdir fuzz
$ cp xmllint fuzz/

$ mkdir fuzz/in
$ cp test/*.xml fuzz/in/

$ cd fuzz

开始 fuzz

在 fuzz 前还需要配置一些系统设置,这里 AFL++ 弄成了脚本,一键配置即可

sudo ~/AFLplusplus/afl-system-config

这里推荐使用 tmux 执行 fuzz,因为一旦终端关闭或者 ssh 断开连接,fuzz 就会终止,使用 tmux 可以保证窗口即便退出后也能继续运行。下面这条 tmux 命令的含义是启动一个新的名为 fuzz 的 tmux 窗口

tmux new -s fuzz

接下来在 fuzz 目录下执行:

~/AFLplusplus/afl-fuzz -i in/ -o out -- ./xmllint @@

接下来就可以看到界面了
在这里插入图片描述

### 使用AFL++ Fuzzing工具 #### 下载与安装 AFL++AFL (American Fuzzy Lop) 的增强版本,提供了更多的功能和改进。可以从其官方仓库下载源码并编译安装[^3]。 ```bash git clone https://github.com/AFLplusplus/AFLplusplus.git cd AFLplusplus make sudo make install ``` 上述命令会克隆 AFL++ 的 Git 仓库到本地,并完成编译和安装过程。 #### 基本使用方法 AFL++ 可以通过指定目标程序及其输入文件来进行模糊测试。基本语法如下: ```bash afl-fuzz -i input_dir -o output_dir -- target_program @@ ``` - `-i` 参数指定了初始种子文件所在的目录。 - `-o` 参数用于保存 fuzz 测试的结果数据。 - `target_program` 表示被测试的目标应用程序路径。 - `@@` 是一个占位符,表示传递给目标程序的实际输入文件位置。 例如,如果要对名为 `example_binary` 的二进制文件进行 fuzz 测试,则可以运行以下命令: ```bash afl-fuzz -i inputs/ -o findings/ -- ./example_binary @@ ``` 这里假设 `inputs/` 文件夹包含了几个有效的样本作为起始点,而所有的发现都将存储在 `findings/` 中。 #### 配置选项 为了提高效率或者适应特定需求,还可以调整一些配置参数。比如启用 QEMU 模式来支持未修改的二进制文件;设置 CPU 数量限制等。更多高级特性可以通过阅读文档进一步了解。 ```bash afl-fuzz -Q -i inputs/ -o results/ -- /path/to/uninstrumented/binary @@ ``` 此命令中的 `-Q` 开启了 QEMU 用户模式仿真器的支持,允许直接分析未经特别处理过的可执行文件。 #### 结合现有项目实例 对于像 OpenSSH 这样的复杂软件包来说,应用 AFL 或者 AFL++ 来寻找潜在漏洞是一项常见实践。具体操作可能涉及重新构建带有适当标记(如 ASan 地址 sanitizer)的应用程序副本以便更好地检测错误条件。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值