Как создать дополненный фаззер AFL, который пропускает определенные семена?
Я студент магистратуры, работающий над тиражированием результатов работы: https://www.microsoft.com/en-us/research/publication/not-all-bytes-are-equal-neural-byte-sieve-for-fuzzing/
Я хочу создать улучшенный фаззер, который отклоняет модификации семян, которые он считает бесполезными. Любая помощь в достижении этого будет очень полезна.
Я создал простую функцию Python для дополненного фаззера. Чтобы проверить реализацию, я взял тривиальную программу "deadbeef" и написал функцию python таким образом, чтобы при изменении семени на "deadbeef" функция отправляла "бесполезный" возврат в функцию "common_fuzz_stuff()" AFL код Это должно означать, что фаззер не должен быть в состоянии обнаружить аварию. Но он все еще может найти аварию, и я не могу определить, где я ошибся.
Вот функция python для AFL:
def check_useful(seed):
my_string = str.encode('deadbeef')
file = open(seed, 'rb')
value = file.read()
if (value == my_string):
print('[*] Crash Found!')
return True
else:
return False
А вот фрагмент кода afl-fuzz.c:
/* Write a modified test case, run program, process results. Handle
error conditions, returning 1 if it's time to bail out. This is
a helper function for fuzz_one(). */
EXP_ST u8 common_fuzz_stuff(char** argv, u8* out_buf, u32 len) {
if (PyCallable_Check(pFuncCheckModel)){
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(queue_cur->fname));
pFuncReturn = PyObject_CallObject(pFuncCheckModel, pArgs);
if (PyObject_IsTrue(pFuncReturn)){
skip_requested = 1;
return 1;
}
} else
{
PyErr_Print();
}
Как моя программа все еще может найти сбой, даже если возвращаемое значение равно 1 из функции common_fuzz_stuff() для начального числа "deadbeef"?
2 ответа
Чтобы ответить на мой собственный вопрос: мне пришлось отправить out_file
в функцию Python вместо queue_cur->fname
,
PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(out_file));
Также skip_requested = 1;
в приведенном выше коде является избыточным.
Теперь запустится фаззер и не найдет сбой
Если ваше решение о том, является ли этот ввод полезным или нет, зависит только от самого входа (не от мутации), насколько я понимаю, вы можете использовать experimental/post_library
вещи. Документация включена в пример post_library и содержит примечание, что это, вероятно, не то, что вы хотите - не вы для ваших конкретных потребностей, это примерное цитирование из этой документации.:)
С другой стороны, это описание API-интерфейса для одной функции содержит следующее:
2) If you want to skip this test case altogether and have AFL generate a
new one, return NULL. Use this sparingly - it's faster than running
the target program with patently useless inputs, but still wastes CPU
time.