用于磁盘解析的Libfuzzer目标

时间:2018-11-24 16:15:07

标签: fuzzing libfuzzer

我目前正在将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*可以做很多事情。

将缓冲区写回到硬盘驱动器以获取文件似乎效率很低。有办法解决吗?

2 个答案:

答案 0 :(得分:0)

您可以使用LD_PRELOAD并覆盖fread。

答案 1 :(得分:0)

您可以按照Google安全团队在this example中的操作进行操作。 定义的here的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函数释放资源。