模糊测试工具 American Fuzzy Lop (一)

顾名思义, American Fuzzy Lop 是一款用于测试程序安全性的模糊测试工具, 官网简介如下:

American fuzzy lop is a security-oriented fuzzer that employs a novel type of compile-time instrumentation and genetic algorithms to automatically discover clean, interesting test cases that trigger new internal states in the targeted binary. This substantially improve the functional coverage for the fuzzed code. The compact synthesized corpora produced by a tool are also useful for seeding other, more labor-or resource-intensive testing regimes down the road.

简单来说, 这款工具能够在程序运行的时候注入自己的code, 然后自动产生testcase进行模糊测试.

模糊测试工具 American Fuzzy Lop (一)_第1张图片
官网截图

AFL 好在哪?

无需配置, 速度快, 可以应对复杂的程序.

void test(char *buf)
{
    int n = 0;
    if(buf[0] == 'b') n++;
    if(buf[1] == 'a') n++;
    if(buf[2] == 'd') n++;
    if(buf[3] == '!') n++;

    if(n == 4) {
        crash();
    }
}

上面的例子中, 需要2^32 或者4百万个尝试才能出发一次崩溃, 这显然效率是很低的. 如果我们一秒钟尝试1000次, 那么出发崩溃所需要的时间就是 2^32/1000/3600/24 = 49 天.

下面我们来尝试一下用AFL来进行模糊测试.
首先编写一个目标程序.

#include 
#include 
#include 

void test (char *buf) {
    int n = 0;
    if(buf[0] == 'b') n++;
    if(buf[1] == 'a') n++;
    if(buf[2] == 'd') n++;
    if(buf[3] == '!') n++;

    if(n == 4) {
        raise(SIGSEGV);
    }
}

int main(int argc, char *argv[]) {
    char buf[5];
    FILE* input = NULL;
    input = fopen(argv[1], "r");
    if (input != 0) {
        fscanf(input, "%4c", &buf);
        test(buf);
        fclose(my_file):
    }
    return 0;
}

然后编译一下

./afl-gcc crasher.c -o crash

因为这个程序是读文件的, 所以我们得给他一个测试用例.

mkdir testcase
echo 'jianshu' > testcase/file

然后开跑!

./afl-fuzz -i testcase -o output/ ./crash @@

模糊测试工具 American Fuzzy Lop (一)_第2张图片
机器截图

通过 run time - last uniq crash的时间可以看出, afl只用了20秒就将程序crash了. 当然, 这是在实验室机器跑的, 如果是一般的机器的话, 时间可能久一点, 我在自己的Mac上跑的时间是15分钟. 对比起暴力测试方法要用49天, afl对效率的提高不止一点半点.

以上

你可能感兴趣的:(模糊测试工具 American Fuzzy Lop (一))