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

use*_*312 5 clang fuzzing libfuzzer

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)
Run Code Online (Sandbox Code Playgroud)

这些API应该如何使用?模糊器需要具有确定性。如何使用自定义变异器确保这一点?

Pam*_*sse 3

您只需要与您的应用程序一起实现这些功能LLVMFuzzerTestOneInput.

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

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

模糊器需要具有确定性。

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

然而,他们有类似的要求。正如源代码、 、LLVMFuzzerCustomMutator和中LLVMFuzzerCustomCrossOver分别概述的那样:

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

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

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

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