我一直在尝试使用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编译另一个版本。然后将gcc版本放在输入文件夹中,我就这样调用模糊器:
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 <lcamtuf@coredump.cx> for troubleshooting tips.
[-] PROGRAM ABORT : Fork server crashed with signal 6
Location : init_forkserver(), afl-fuzz.c:2056
我做错了什么?
答案 0 :(得分:3)
第一个问题是您将输入传递给afl-fuzz作为文件,其中包含&#39; @@&#39;程序获取命令行参数时的命令。 afl接受来自stdin或文件的输入。 http://lcamtuf.coredump.cx/afl/README.txt
导致崩溃的第二个问题是afl给测试用例文件名提供的自动名称:
[*] Attempting dry run with 'id:000000,orig:a.out'...
这足以溢出缓冲区并导致段错误。
答案 1 :(得分:1)
要完成冬季静音响应,如果你想尝试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视为崩溃。因此,通过此示例,您将获得多个不同的崩溃。