如何使用 libfuzzers 自定义突变器 API?



Libfuzzer 提供了两个 API 来开发自定义突变器。

size_t LLVMFuzzerCustomMutator(uint8_t *Data, size_t Size, size_t MaxSize, unsigned int Seed)
size_t LLVMFuzzerCustomCrossOver(const uint8_t *Data1, size_t Size1, const uint8_t *Data2, size_t Size2, uint8_t *Out, size_t MaxOutSize, unsigned int Seed)

应该如何使用这些 API? 模糊器必须是确定性的。如何确保自定义突变器如此?

您只需要在LLVMFuzzerTestOneInput一起实现这些功能即可。

google/fuzzing 存储库有一个关于如何实现结构感知模糊测试的教程。

此外,您可以从LLVM存储库的CustomMutatorTest.cpp和CustomCrossOverTest.cpp中获取灵感。

模糊器必须是确定性的。

对,但在这里您将编写不同的突变函数;突变将在调用LLVMFuzzerTestOneInput之前发生。

但是,它们具有类似的要求。 如源代码中所述,分别与LLVMFuzzerCustomMutatorLLVMFuzzerCustomCrossOver一起:

可选的用户提供的自定义突变器。 就地更改 [数据、数据+大小( 中的原始数据。 返回不大于最大大小的新大小。 给定相同的种子产生相同的突变。

可选的用户提供的自定义交叉功能。 将 Data1 和 Data2 片段组合到 Out 中。 返回不大于最大输出大小的新大小。 给定相同的种子,应该产生相同的突变。

即,对具有相同Dataseed的突变函数的两次调用应该产生相同的结果。

最后一件事:你不需要实现这两个函数; 在大多数情况下,LLVMFuzzerCustomMutator应该足够了。

相关内容

  • 没有找到相关文章

最新更新