В настоящее время я интегрирую libFuzzer
в проект, который анализирует файлы на жестком диске.У меня есть некоторый предыдущий опыт работы с AFL, где использовалась такая командная строка:
afl-fuzz -m500 -i input/ -o output/ -t100 -- program_to_fuzz @@
... где @@
- это путь к сгенерированному вводу.Однако, глядя на libFuzzer
, я вижу, что цели fuzz выглядят так:
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*
.
Запись буфера обратно на жесткий диск для возврата файла кажется крайне неэффективной.Есть ли способ обойти это?