0

我目前正在集成libFuzzer一个解析硬盘驱动器上文件的项目。我在 AFL 方面有过一些经验,其中使用了像这样的命令行:

afl-fuzz -m500 -i input/ -o output/ -t100 -- program_to_fuzz @@

...@@生成输入的路径在哪里。libFuzzer然而,我看到模糊目标看起来像这样:

extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
  DoSomethingInterestingWithMyAPI(Data, Size);
  return 0;  // Non-zero return values are reserved for future use.
}

我知道输入不是以文件的形式提供的,而是作为内存中的缓冲区提供的。问题是我试图模糊测试的程序处理文件并通过fread()调用获取其数据。在任何时候都不应该将整个输入加载到内存中(在一般情况下,它甚至可能不适合);所以我无能为力const uint8_t*

将缓冲区写回硬盘驱动器以取回文件似乎效率极低。有没有解决的办法?

4

2 回答 2

0

您可以使用 LD_PRELOAD 并覆盖 fread。

于 2018-12-04T12:33:07.213 回答
0

你可以像谷歌安全团队的这个例子一样做。此处定义的 buf_to_file获取您的缓冲区并返回一个 char* 路径名,然后您可以将其传递给您的目标:(
来自https://github.com/google/security-research-pocs/blob/master/autofuzz/fuzz_utils.h#L27 )

// Write the data provided in buf to a new temporary file. This function is  
// meant to be called by LLVMFuzzerTestOneInput() for fuzz targets that only  
// take file names (and not data) as input.  
//  
// Return the path of the newly created file or NULL on error. The caller should  
// eventually free the returned buffer (see delete_file).   
extern "C" char *buf_to_file(const uint8_t *buf, size_t size);

请务必使用delete_file函数释放资源。

于 2019-01-20T17:46:09.177 回答