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

作者: 妞妞乌SirSir | 来源:发表于2016-04-05 01:00 被阅读3163次

    顾名思义, 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进行模糊测试.

    官网截图

    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 <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    
    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 @@

    机器截图

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

    以上

    相关文章

      网友评论

      • Annlyee:大哥你放代码上来之前也不检查一下。。
      • e2b3ec44b0ac:你好,我做了同样的尝试,为啥跑了8个小时,进行了60多k的cycles,还是没有crash呢?
        ./afl-fuzz -i mytest/inputdir/ -o mytest/outputdir/ mytest/crash @@
        文件目录
        [root@localhost mytest]# ls
        crash crash.c inputdir outputdir
        [root@localhost inputdir]# ls
        file
        xi4okv:修改一下代码,触发代码改为bad 几秒钟就crash了。

        然后我改成zzmzz 貌似需要好久。
        wmissn:@请叫我污博 本身可能就有一些随机性

      本文标题:模糊测试工具 American Fuzzy Lop (一)

      本文链接:https://www.haomeiwen.com/subject/zaullttx.html