4

Libfuzzer 提供了两个 API 来开发自定义 mutator。

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 应该如何使用?模糊器必须是确定性的。如何使用自定义突变器确保这一点?

4

1 回答 1

2

你只需要在你的LLVMFuzzerTestOneInput.

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

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

模糊器必须是确定性的。

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

但是,它们有类似的要求。如源代码、 旁边LLVMFuzzerCustomMutatorLLVMFuzzerCustomCrossOver中所述:

可选的用户提供的自定义 mutator。就地改变 [Data, Data+Size) 中的原始数据。返回不大于 MaxSize 的新大小。给定相同的种子产生相同的突变。

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

两次调用具有相同的突变函数Data并且seed应该产生相同的结果。

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

于 2021-07-28T19:25:08.203 回答