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应该如何使用?模糊器必须是确定性的。如何使用自定义变异器确保这一点?
发布于 2021-07-28 19:25:08
您只需将这些函数与LLVMFuzzerTestOneInput一起实现即可。
google/fuzing资源库有一个关于如何实现结构感知的模糊化的教程。。
此外,您还可以从CustomMutatorTest.cpp和CustomCrossOverTest.cpp那里获得灵感,它们来自LLVM存储库。
模糊器必须是确定性的。
是的,但是在这里您将编写变异函数,它们是不同的;在调用LLVMFuzzerTestOneInput之前会发生突变。
然而,它们也有类似的要求。正如源代码中所概述的,LLVMFuzzerCustomMutator和LLVMFuzzerCustomCrossOver分别是:
可选用户提供的自定义变送器。在[ data,Data+Size)位置上突变原始数据。返回新大小,该大小不大于MaxSize。同样的种子会产生同样的突变。可选用户提供的自定义交叉功能。将Data1和Data2片段合并到Out中。返回新大小,该大小不大于MaxOutSize。应该产生相同的突变给同样的种子。
,即对具有相同Data和seed的突变函数的两个调用应该产生相同的结果。
最后一件事:您不需要实现这两个函数;在大多数情况下,LLVMFuzzerCustomMutator应该足够了。
https://stackoverflow.com/questions/62706527
复制相似问题