Fuzzing系列学习
参考:
HotSec/Fuzzing101: An step by step fuzzing tutorial. A GitHub Security Lab initiative
原理
生成随机输入并将其输入到目标程序中,以寻找程序中的漏洞
1 | 选择种子文件:AFL会选择一些种子文件,作为测试用例的基础,用于生成随机输入。种子文件可以是程序的正常输入,也可以是其他测试用例。 |
主要流程
通过AFL生成大量变异文件
AFL输入这些变异数据,监控crash情况
测试产生crash的对应的变异文件 运行产生的错误
gdb调试,根据崩溃点找到漏洞
工具下载
1 | cd $HOME |
测试 afl-fuzz
Exercise 1 -Xpdf
Xpdf
1 | XpdfReader 是一个免费的(但不是开源的)PDF查看器,它包含一些在开源xpdf查看器中找不到的额外功能。跨平台 |
开源的Xpdf工具包包含以下几个命令行工具,可以对PDF进行命令操作,实现对PDF文件多种转换操作及其他命令操作.
- pdftotext:将PDF转换为文本
- pdftops:将PDF转换为PostScript
- pdftoppm:将PDF页面转换为netpbm(PPM / PGM / PBM)图像文件
- pdftopng:将PDF页面转换为PNG图像文件
- pdftohtml:将PDF转换为HTML
- pdfinfo:提取PDF元数据
- pdfimages:从PDF文件中提取原始图像
- pdffonts:列出PDF文件中使用的字体
- pdfdetach:从PDF文件中提取附件
fuzzing
这里其实是在源码中编译插桩了,这是有源码的情况下使用
经历了3个小时多 终于crach了QAQ。。。。
吃了个饭。。洗了个澡,做了会儿作业…还没crash,还以为是它把洞修上了 结果 原来是我机器太拉了呀 放心了
🤡🤡🤡
崩溃复现
段错误,内存泄漏
分析原因
重新编译一下
1 | rm -r $HOME/fuzzing_xpdf/install |
gdb调试 查看崩溃点的堆栈信息
1 | gdb --args $HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/id:000000,sig:11,src:001864,time:10787447,execs:6003676,op:havoc,rep:4 $HOME/fuzzing_xpdf/output |
???为啥我是在getchar的报错捏???不会是我ubuntu18的问题叭??挖到新洞了??
getchar也就是单字节?
这是溢出点的代码
通过递归调用的,所以还是获得字符串
下个断点看看xxxxx PIE呢 怎么断xxxx哎呀 这是通过coredump文件调的拉 地址不变捏 可以断
原因
向错误地址读取数据 往上看一下eax怎么来的
1 | 0x55555560122c <EmbedStream::getChar()+66> mov rax, qword ptr [rbp - 8] |
参数传的
这里传的
调了一下0x00005555555a2aae处的execOp 看了一下 循环free了 然后 突然就跳到getchar()了 看一下 是call rax跳的(虚函数?动态绑定) 跳到opBeginImage,然后最后来到getchar()
这里崩溃的原因是 EmbedStream 类没有初始化 导致成员函数limited为0,同时lenth也为0,执行了lenth–后,lenth=0xffffffffffffffff 然后 最后的崩毁 是没在虚表中找到getchar函数
嗷嗷 知道了这里就是由于没有初始化EmbedStream生成的对象 成员limited和lenth为0
看源码可以知道这里找的是strA 但由于strA没有初始化,是0(NULL)空 ,而这里又要调用str的方法,导致他无法正确寻址 找到无效地址 从而导致了崩溃
所以 这里应该是个BUG 修复的话就是判断一下str是否为NULL应该也可以,或者判断一下这个对象有没有初始化。
后面拿ubuntu20.04试了,雀氏是系统问题,20系统就是无限递归导致的栈溢出,
这里引发的思考就是 怎么利用捏? 布兹道QAQ
怎么感觉 这就是一个程序的bug呀????能利用吗??拒绝服务??