LibAFL和HardWare Fuzzing学习 1

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/
作者
Seddon
发布于
2024年7月18日
许可协议