Как использовать 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
в большинстве случаев должно быть достаточно.