模糊测试—AFL——实战小记

本文详细描述了如何在VM虚拟机上安装Ubuntu-22.04系统,配置LLVM和CLANG,以及使用AFL进行代码插桩和模糊测试的过程,包括解决编译时遇到的错误和测试环境设置。

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

一 安装环境:

vm虚拟机上使用Ubuntu-22.04系统的镜像。

清华和科大的镜像都可以,下载下来的是ISO的压缩包,不用解压(出来的是一堆文件),在安装新的VM虚拟机时,在镜像源里面直接选择下载下来的压缩包。

二 正式安装

2.1 安装LLVM和CLANG

sudo apt-get install clang
sudo apt-get install llvm

注:clang是llvm的子项目,但是它们的源码是分开的,我们需要将clang放在llvm/tools目录下。 

  • AFL 使用 LLVM/Clang 进行代码插桩:AFL 利用 LLVM/Clang 提供的插桩功能,通过修改编译器生成的可执行文件,实现对代码的覆盖率插桩,从而能够监测程序执行时经过的路径,用于模糊测试的导向。

  • AFL 需要 LLVM/Clang 编译器:AFL 包含了一些工具,如 afl-gcc,它们实际上是 LLVM/Clang 的包装器,用于在编译过程中实现代码插桩等操作。

2.2   下载、解压、编译和安装 AFL工具

wget
### 使用 AFL 对 Modbus 协议进行模糊测试 为了使用 AFL 工具对 Modbus 协议进行模糊测试,可以按照以下方式构建环境并准备必要的资源: #### 准备工作 AFL 是一种基于覆盖率引导的模糊测试工具,它依赖于种子文件来生成初始输入[^3]。因此,在开始 fuzzing 测试之前,需要准备好适合 Modbus 协议的种子文件。 可以通过 libmodbus 提供的测试用例获取高质量的种子文件。具体来说,`random-test` 文件夹下的测试用例被证明是非常有用的起点[^4]。这些测试用例经过精心设计,能够覆盖多种可能的情况,从而提高 fuzzing 的效率和效果。 #### 构建目标程序 确保目标程序支持接收 Modbus 数据包作为输入,并能正确解析它们。如果目标是一个网络服务,则需将其修改为接受标准输入(stdin),以便 AFL 能够直接向其发送数据。通常的做法是编写一个简单的 wrapper 程序,该程序会读取 stdin 并调用目标函数处理接收到的数据。 以下是创建这样一个 wrapper 程序的一个简单例子: ```c #include <stdio.h> #include <stdlib.h> int main() { unsigned char buffer[1024]; size_t bytes_read; // 从标准输入读取数据 while ((bytes_read = fread(buffer, 1, sizeof(buffer), stdin)) > 0) { process_modbus_data(buffer, bytes_read); // 替换为目标程序的实际入口点 } return 0; } ``` 编译此程序时,请记得启用地址 sanitizer 和其他调试选项以帮助检测潜在的安全问题。 #### 启动 AFL 进行 fuzzing 完成上述准备工作之后,即可启动 AFL 来执行实际的模糊测试过程。命令大致如下所示: ```bash afl-fuzz -i input_directory -o output_directory ./compiled_program @@ ``` 其中 `input_directory` 应指向包含所选 seed files 的目录;而 `output_directory` 则用于存储由 AFL 找到的新颖 test cases 及崩溃报告等信息。 #### 结果分析 随着 fuzzing 时间的增长,AFL 将不断探索新的路径并通过变异现有 inputs 发现更多 edge case 。定期检查 outputs 中是否有触发 bug 或 crash 的实例非常重要。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值