Как создать улучшенный фаззер AFL, который пропускает определенные семена? - PullRequest
0 голосов
/ 20 января 2019

Я студент магистратуры, работающий над тиражированием результатов работы: 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 ]

0 голосов
/ 12 февраля 2019

Чтобы ответить на мой собственный вопрос: Мне пришлось отправить out_file в функцию Python вместо queue_cur->fname.

PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(out_file));

Также skip_requested = 1; в приведенном выше коде является избыточным.

Теперь фаззер запустится и не найдет сбой

0 голосов
/ 06 февраля 2019

В случае, если ваше решение, является ли этот ввод полезным или нет, зависит только от самого входа (не мутация), насколько я понимаю, вы могли бы использовать материал 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.
...