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
之前发生。
但是,它们具有类似的要求。 如源代码中所述,分别与LLVMFuzzerCustomMutator
和LLVMFuzzerCustomCrossOver
一起:
可选的用户提供的自定义突变器。 就地更改 [数据、数据+大小( 中的原始数据。 返回不大于最大大小的新大小。 给定相同的种子产生相同的突变。
可选的用户提供的自定义交叉功能。 将 Data1 和 Data2 片段组合到 Out 中。 返回不大于最大输出大小的新大小。 给定相同的种子,应该产生相同的突变。
即,对具有相同Data
和seed
的突变函数的两次调用应该产生相同的结果。
最后一件事:你不需要实现这两个函数; 在大多数情况下,LLVMFuzzerCustomMutator
应该足够了。