Как использовать API пользовательских мутаторов libfuzzers?

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? Фаззер должен быть детерминированным. Как я могу гарантировать это с помощью специальных мутаторов?

1 ответ

Вам просто нужно реализовать эти функции вместе с вашим.

В репозитории google / fuzzing есть руководство о том, как реализовать фаззинг с учетом структуры .

Кроме того, вы можете почерпнуть вдохновение из CustomMutatorTest.cpp и CustomCrossOverTest.cpp из репозитория LLVM.

Фаззер должен быть детерминированным.

Верно, но здесь вы будете писать разные функции мутации; Мутации произойдут до вашего LLVMFuzzerTestOneInput называется.

Однако у них есть аналогичное требование. Как указано в исходном коде , рядом с LLVMFuzzerCustomCrossOver соответственно:

Необязательный пользовательский настраиваемый мутатор. Изменяет необработанные данные в [Data, Data+Size) на месте. Возвращает новый размер, не превышающий MaxSize. Одно и то же семя производит ту же мутацию.

Дополнительная настраиваемая функция перехода, предоставляемая пользователем. Объединяет части Data1 и Data2 вместе в Out. Возвращает новый размер, не превышающий MaxOutSize. Должен вызывать ту же мутацию при том же семени.

т.е. два вызова функции мутации с одним и тем же Data и seed должен дать тот же результат.

И последнее: вам не нужно реализовывать обе функции; LLVMFuzzerCustomMutator в большинстве случаев должно быть достаточно.

Другие вопросы по тегам