首页
论坛
课程
招聘
[原创]afl-training_libxml2_事例学习
2020-6-14 20:31 1808

[原创]afl-training_libxml2_事例学习

2020-6-14 20:31
1808

最近在学习afl的使用,作者比较菜,希望大佬们可以指点一二
afl-training是根据现实案例为模板进行的afl使用练习
且玩且开心
项目地址
https://github.com/mykter/afl-training.git
食用之前可以参考
https://www.codercto.com/a/78143.html
https://mp.weixin.qq.com/s?__biz=MzIxMTU2MzI0MA==&mid=2247483666&idx=1&sn=820c8806a3fb05ca9497255dcf59890e&chksm=97522695a025af8372d6d1fda1445a8537aa65f5b3cfcd829425ffb46217e87982dbee5a1174&scene=126&sessionid=1592138469&key=5e5ea98545184748a98a3daaf1d233f0bf7d5cbfa02f6edd0b7b7de9d8d790cfafe1a63b2f8abe3378198f2d65db5f8f7fda7acca2353a9e8d519633c863c7386733d29aa2d7f3fea62c5955c8b21e5f&ascene=1&uin=MjQ1MTk5MzQyNA%3D%3D&devicetype=Windows+10+x64&version=62090070&lang=zh_CN&exportkey=AQs04%2FRfvt6kSf91rqHczSU%3D&pass_ticket=ythpxXbdTxaMOMclVdjVLQuPrrLUaGykBRzfR%2B5ksp%2BNSiZQTDQ9jiDFqGsGyGcW

 

--------------------华丽分割线-------------------
libxml2是一个流行库,该库很适合fuzz

git clone https://gitlab.gnome.org/GNOME/libxml2.git
cd libxml2
vim autogen.sh

图片描述

 

(项目由autoconf编译
Autoconf解决了系统特使构建和运行时信息的难题,但在软件开发时还有更多的难题,GNU构建系统是为了更好的开发软件而开发的一套完整的公益事业。
主要组成部分有Autoconf、Automake和Libtool
)

sudo apt-get install automake #为了兼容各个系统到make使用
sudo apt-get install autocon
sudo apt-get install libtool #Libtool会处理所有的共享库请求。需要共享库的时候会自Libtool会自动地被使用,无需知晓其语法规则
CC=afl-clang-fast ./autogen.sh
AFL_USE_ASAN=1 make -j 4

(ASAN是linux下内存检测工具,为了后期更好的分析crash,在此处可以开启Address Sanitizer(ASAN)这个内存检测工具,此工具可以更好的检测出缓存区溢出、UAF 等内存漏洞)

 

好的,操作到这里,libxml2的库应该就被插桩编译完成了
下面就是寻找fuzz点,编写一个harness

cd /home/f4our/Fuzzing_Sample/afl-training/challenges/libxml2/libxml2/doc/examples
vim parse1

图片描述

fuzz点一(这也是afl-traing中官方给出解)

xmlReadFile()
好的,围绕这个点编写harness(作者在这里想了想,写的和结果差不多,这里就直接贴答案了)
以下harness.c文件

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

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

    xmlInitParser();
    while (__AFL_LOOP(1000)) {
        xmlDocPtr doc = xmlReadFile(argv[1], NULL, 0);
        if (doc != NULL) {
            xmlFreeDoc(doc);
        }
    }
    xmlCleanupParser();

    return(0);
}

(afl_loop解析
我们将1000传递给了afl_loop()函数。这就相当于AFL在启动一个新进程前,要fuzz1000个测试用例,当然这是消耗内存的,并且这可以根据正在模糊化到应用程序进行高度可调。添加这种代码启用持久模式并不容易。由于在启动期间产生的资源或其他因素,一些应用程序可能没有支持轻松添加while循环到体系结构)

 

harness很简单,就是通过输入不同的测试用例不停地fuzz xmlReadFile函数

AFL_USE_ASAN=1 /home/f4our/afl-2.52b/afl-clang-fast ./harness.c -I /home/f4our/Fuzzing_Sample/afl-training/challenges/libxml2/libxml2/include /home/f4our/Fuzzing_Sample/afl-training/challenges/libxml2/libxml2/.libs/libxml2.a -lz -lm -o harness

编译成功,下图相关参数解析
图片描述

 

开始fuzz

mkdir in
echo "<hi></hi>" > in.hi.xml  #此处创建测试用例
afl-fuzz -m none -i in -o out ./harness @@

-m参数表示对于子进程的内存限制

 

图片描述

fuzz点二(xmlReadMemory)

这个函数的使用事例在parse3.c
图片描述
作者比较菜,这里给出自己的答案,如果有错误,评论区指出,秉着不要脸的原则,意见随便提,有用我就改,欢迎大家提供更好的harness

#include <stdio.h>
#include <unistd.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#define SIZE 1024
int main(int argc, char **argv){
    xmlDocPtr doc;

    char buf[1024] = {0};

    while(__AFL_LOOP(1000)){
    xmlInitParser();
    int length = read(STDIN_FILENO,buf,SIZE);
    doc = xmlReadMemory(buf,length, "noname",NULL,0);
    if(doc == NULL)
    {
        xmlFreeDoc(doc);
    }

}

与上一版的不同就是作者把初始化和清理都写在了循环里
编译成功后,开始fuzz,与此同时我们可以使用afl自带的xml字典测试样例,拷贝到in目录中
目录 afl-2.52b/dictionaries/xml.dict

afl-fuzz -m none -i in -o out ./harness

图片描述

 

关于xmlReadMemory到harness可以参考
https://github.com/google/fuzzer-test-suite/tree/master/libxml2-v2.9.2

 

如果有问题,大家请轻点喷,凡是能让我恐惧的,皆会让我成长 感谢!!!


[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

最后于 2020-6-14 20:41 被F4our444编辑 ,原因: 添加url
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回