如何使用 libfuzzers 自定义修改器 API?
How to use libfuzzers custom mutators 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 repository has a tutorial on how to implement structure-aware fuzzing.
另外,您可以从 CustomMutatorTest.cpp, and CustomCrossOverTest.cpp 的 LLVM 存储库中获得灵感。
The fuzzer is required to be deterministic.
是的,但是在这里您将编写不同的变异函数;突变会在你的 LLVMFuzzerTestOneInput
被调用之前发生。
但是,他们有类似的要求。
如 source code 中所述,分别与 LLVMFuzzerCustomMutator
和 LLVMFuzzerCustomCrossOver
一起:
Optional user-provided custom mutator.
Mutates raw data in [Data, Data+Size) inplace.
Returns the new size, which is not greater than MaxSize.
Given the same Seed produces the same mutation.
Optional user-provided custom cross-over function.
Combines pieces of Data1 & Data2 together into Out.
Returns the new size, which is not greater than MaxOutSize.
Should produce the same mutation given the same Seed.
即两次调用具有相同Data
和seed
的变异函数应该产生相同的结果。
最后一件事:您不需要同时实现这两个功能; LLVMFuzzerCustomMutator
在大多数情况下应该足够了。
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 repository has a tutorial on how to implement structure-aware fuzzing.
另外,您可以从 CustomMutatorTest.cpp, and CustomCrossOverTest.cpp 的 LLVM 存储库中获得灵感。
The fuzzer is required to be deterministic.
是的,但是在这里您将编写不同的变异函数;突变会在你的 LLVMFuzzerTestOneInput
被调用之前发生。
但是,他们有类似的要求。
如 source code 中所述,分别与 LLVMFuzzerCustomMutator
和 LLVMFuzzerCustomCrossOver
一起:
Optional user-provided custom mutator. Mutates raw data in [Data, Data+Size) inplace. Returns the new size, which is not greater than MaxSize. Given the same Seed produces the same mutation.
Optional user-provided custom cross-over function. Combines pieces of Data1 & Data2 together into Out. Returns the new size, which is not greater than MaxOutSize. Should produce the same mutation given the same Seed.
即两次调用具有相同Data
和seed
的变异函数应该产生相同的结果。
最后一件事:您不需要同时实现这两个功能; LLVMFuzzerCustomMutator
在大多数情况下应该足够了。