AFL-training复现学习过程(二)

Challenge

  • libxml2

  • heartbleed

  • sendmail

  • ntpq

  • date

  • cyber-grand-challenge

Libxml2

        libxml2是一个流行的XML处理库,使用C语言实现,其具有以下的特点使其非常适合用于练习Fuzz:

①无状态

②无网络通信和文件读写

③文档详细丰富,API外显,无需额外分析内部的fuzz接口

④功能集中、简单(处理XML),运行较快

这里考虑的CVE(Common Vulnerabilities &Exposures)是CVE-2015-8317。

根据AFL-training先下载对应版本的libxml2:

git clone https://github.com/GNOME/libxml2.git
cd libxml2
git submodule init
git submodule update
git checkout v2.9.2

然后进行编译:

CC=afl-clang-fast ./autogen.sh 
AFL_USE_ASAN=1 make -j 4

AFL_USE_ASAN的作用是启动ASAN特性来更好的检测崩溃

然后编写harness来对函数进行检测,libxml2提供的接口有很多,可以通过官方手册来进一步理解。这里我们选取官方提供的Libxml2 set og examples中的parse1.c:Paese an XML file to a tree and free it来进行修改,最终得到的harness.c代码如下所示:

#include "libxml/parser.h"
#include "libxml/tree.h"

int main(int argc, char **argv) {
    if (argc != 2)
        return -1;

    xmlDocPtr doc; /* the resulting document tree */

    doc = xmlReadFile(argv[1], NULL, 0);
    if (doc == NULL) {
            return -1;
    }
    xmlFreeDoc(doc);

    xmlCleanupParser();

    return 0;
}

可以看到fuzz最主要的api是xmlReadFile、xmlFreeDoc及xmlCleanupParser函数,通过命令行传入xml文件名称,接着对应的函数对文件数据进行解析。

编译harness,命令如下所示:

AFL_USE_ASAN=1 afl-clang-fast ./harness.c -I libxml2/include libxml2/.libs/libxml2.a -lz -lm -o fuzzer

创建模糊测试种子文件:

mkdir in
vim in/seed.xml

seed.xml文件内容如下所示:



  Tove
  Jani
  Reminder
  Don't forget me this weekend!

启动AFL进行fuzzer:

afl-fuzz -m none -i in -o out ./fuzzer @@

这里使用@@是因为harness用的是argv作为输入,而不是stdin,所以这里使用@@

下面是运行结果的截图:

AFL-training复现学习过程(二)_第1张图片

你可能感兴趣的:(学习,测试覆盖率)