AFL-fuzz не обнаружил никаких сбоев

#c #fuzzing #american-fuzzy-lop #afl-fuzz

Вопрос:

Я впервые пробую AFL, и по этой причине я нашел очень простой уязвимый код на языке Си, который я мог бы использовать для тестирования AFL.

Код C в вопросах таков

 #include <stdio.h>
#include <string.h>

int main(int argc, char * argv[]){
        char name[10];

        if ( argc > 1 ){
                strcpy(name, argv[1]);
                printf("HELLO %sn", name);
        }

        return 0;
}
 

Я компилирую этот код, запустив afl-gcc test.c -o test его, и протестировал его, чтобы убедиться, что он выходит из строя, когда это предполагалось (запуск ./test $(python3 -c "print('A'*26)") приведет к ошибке сегментации, как и ожидалось).

Проблема здесь в том, что я создал тестовый echo -en "testx00" > input/testcase набор и запустил AFL afl-fuzz -i afl_in -o afl_out -- ./test , но через день он все еще не обнаружил никаких сбоев.

Я также попытался создать тестовый случай, который вынудил бы его к сбою python3 -c "print('A'*26)" > input/testcase , но он все равно запускается и ничего не находит.

Предполагалось, что это будет самый простой пример, чтобы я мог немного лучше узнать AFL, но это оказалось непростой задачей. Кто-нибудь может помочь?

Комментарии:

1. Похоже, AFL ожидает, что тестируемая программа будет считывать данные из STDIN, а не из аргумента. github.com/google/AFL#6-fuzzing-binaries

2. Или ну … из файла, если вы укажете его правильно, как написано в readme.

3. Спасибо! в итоге я последовал по URL @NickODell, и, хотя это экспериментально, это очень хорошо работает для этого простого примера… это позволяет мне протестировать AFL и привыкнуть к нему.

Ответ №1:

Так же, как Ник Оделл опубликовал это в комментариях

Похоже, AFL ожидает, что тестируемая программа будет считывать данные из STDIN, а не из аргумента. github.com/google/AFL#6-fuzzing-binaries

Следующий URL-адрес показывает экспериментальный модуль, который позволяет AFL считывать из аргумента, и для этого мне просто нужно было добавить 2 строки в существующий код:

 #include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "argv-fuzz-inl.h" // <-- Argv fuzz module


int main(int argc, char * argv[]){
        AFL_INIT_ARGV(); // <-- needed near the very beginning of main().
        char name[10];

        if ( argc > 1 ){
                strcpy(name, argv[1]);
                printf("HELLO %sn", name);
        }

        return 0;
}
 

После этого я просто скомпилировал его снова, и все работало так, как ожидалось.