#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;
}
После этого я просто скомпилировал его снова, и все работало так, как ожидалось.