LibAFL和HardWare Fuzzing学习 1
LibAFL框架
- 由Rust编写,个人认为是比较好用,适合在上面进行一些工作的选择
- 手册: https://aflplus.plus/libafl-book/
- 源代码: https://github.com/AFLplusplus/LibAFL
XFuzz
几个关键的组件库
- xfuzz:源代码
- riscv-arch-test:官方提供的测试用例文件
- riscv-isa-sim:Spike, a RISC-V ISA Simulator
针对Chisel设计的插桩
- 位于xfuzz的instrumentation文件夹下
- 移植自:rfuzz、difuzz-rtl、simulator-independent-coverage
- 由于FIRRTL的限制,Chisel<=3.6.0才支持目前的插桩操作
- All supported Chisel/FIRRTL coverage metrics are listed in the CoverPoint.getTransforms function here.
代码阅读详解
src下的rust源码
coverage.rs
这个文件定义了一个Coverage结构体和一些操作这个结构体的方法。Coverage结构体用于跟踪覆盖点,并提供初始化、累积、计算覆盖率和显示覆盖率的功能。通过静态变量ICOVERAGE,可以在全局范围内管理一个Coverage实例,并通过一些函数对其进行操作。
相当于实现了Fuzzer中覆盖率的定义。
fuzzer.rs
fuzzer.rs 文件主要负责配置和运行模糊测试器(fuzzer)。它设置了模糊测试的各个组件,包括调度器、反馈机制、目标检测、状态管理、事件管理器、模糊测试器和执行器,并根据传入的参数处理错误、初始化语料库、设置随机输入和变异器,最终执行模糊测试循环。
harness.rs
sim_run 函数的主要功能是准备模拟器需要的参数,调用模拟器的主函数,然后更新覆盖统计信息,并返回模拟器的返回值。
lib.rs
lib.rs 文件定义了程序的入口点 main 函数,并通过解析命令行参数来控制程序的行为。程序分为仿真运行和模糊测试两个主要部分。通过使用 clap 库解析命令行参数,并根据参数执行相应的功能,如设置仿真环境、运行仿真、显示覆盖率以及运行模糊测试。
monitor.rs
这个文件定义了两个函数 store_testcases 和 store_testcase。store_testcases 函数用于遍历语料库中的每个测试用例,并调用 store_testcase 函数将其存储到指定的输出目录中。store_testcase 函数用于创建输出目录,并根据提供的文件名或计算的 MD5 哈希值将输入保存为文件。
LibAFL和HardWare Fuzzing学习 1
http://seddon.lol/2024/07/18/LibAFL和HardWare-Fuzzing学习-1/