2016-03-12 3 views
0

я пытался использовать американский Fuzzy Lop, но я не могу заставить его работать на простом примере, как это:American Fuzzy Lop не удается с помощью простого примера

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

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

if (argc > 1){ 
strcpy(name, argv[1]); 

printf("HELLO %s\n", name); 
} 

return 0; 
} 

компилировать одну версию этого кода используя обычный gcc и другой, используя afl-clang. ССАГПЗ версия затем помещается в папку ввода, и я назвать fuzzer так:

afl-fuzz -i input/ -o output/ -m 2G ./a.out @@ 

Но это не работает.

[*] Attempting dry run with 'id:000000,orig:a.out'... 
[*] Spinning up the fork server... 

[-] Whoops, the target binary crashed suddenly, before receiving any input 
    from the fuzzer! There are several probable explanations: 

    - The current memory limit (2.00 GB) is too restrictive, causing the 
     target to hit an OOM condition in the dynamic linker. Try bumping up 
     the limit with the -m setting in the command line. A simple way confirm 
     this diagnosis would be: 

     (ulimit -Sv $[2047 << 10]; /path/to/fuzzed_app) 

     Tip: you can use http://jwilk.net/software/recidivm to quickly 
     estimate the required amount of virtual memory for the binary. 

    - The binary is just buggy and explodes entirely on its own. If so, you 
     need to fix the underlying problem or find a better replacement. 

    - Less likely, there is a horrible bug in the fuzzer. If other options 
     fail, poke <[email protected]> for troubleshooting tips. 

[-] PROGRAM ABORT : Fork server crashed with signal 6 
     Location : init_forkserver(), afl-fuzz.c:2056 

Что я делаю неправильно?

+0

Я не совсем понимаю, какие параметры фактически переданы программе. – Downvoter

+0

AFL должен иметь пример канонического кода, который вы можете попробовать. – user3386109

+0

'char name [10];' слишком коротко, чтобы удерживать фактический переданный параметр. Используйте ['strncpy (.., .., 10)'] (http://linux.die.net/man/3/strncpy) вместо 'strcpy' – Soren

ответ

3

Первая проблема заключается в том, что вы передаете вход afl-fuzz в виде файла с командой «@@», в то время как программа принимает аргумент командной строки. afl принимает входные данные из stdin или файлов. http://lcamtuf.coredump.cx/afl/README.txt

Второй выпуск причиной аварии на старте является автоматическое название, данное AFL на тестовый файла:

[*] Attempting dry run with 'id:000000,orig:a.out'... 

Который достаточно переполнения вашего буфера и вызвать Segfault.

1

Для завершения Wintermute ответа, если вы хотите попробовать AFL или продемонстрировать, что она работает, Вы можете сделать что-то подобное:

переменной path это путь от вашего @@ аргумента

char *buff; 

if ((buff = malloc(10)) == NULL) 
    abort(); 

if ((fd = fopen(path, "r")) == NULL) 
    abort(); 
fread(buff, 10, 1, fd); 

if (strncmp(buff, "h", 1) == 0) 
{ 
    if (strncmp(buff, "he", 2) == 0) 
    { 
    if (strncmp(buff, "hel", 3) == 0) 
    { 
     if (strncmp(buff, "hell", 4) == 0) 
     { 
     if (strncmp(buff, "hello", 5) == 0) 
     { 
      buff[9] = 0; //just to be sure... 
      fprintf(stderr, "Nailed it ! input file is %s\n", buff); 
      abort(); 
     } 
     } 
     else 
     { 
     abort(); // it should be found quick 
     } 
    } 
    } 
} 
free(buff); 
fclose(fd); 

Использования abort() приведет к незаконным инструкциям, которые рассматриваются как сбой AFL. Таким образом, в этом примере вы получите несколько разных сбоев.

Смежные вопросы