堆漏洞——实战double free和unlink漏洞

0ctf freenote:从逆向分析到exploit编写!

鄙人的上一篇文章中,还算较为详细的讲解了unlink漏洞的原理,在阅读本篇文章之前建议先学习上一篇blog

现在我们开始学习,这道ctf题目现在已经挂在Jarvis OJ上了,下面给出nc的url和程序下载链接:

nc pwn2.jarvisoj.com 9886

https://files.cnblogs.com/files/Magpie/level6_x64.rar

首先分析程序功能:

程序是典型的记事本程序,功能上基本就是添加记录、打印列出所有记录、编辑记录、删除记录。

各位既然已经开始接触堆溢出类题目,相信入坑二进制应该已经有段时间的,基本的逆向分析能力应该都是有的,因此不一一讲解IDA中的分析过程,在此本人只简单地说一下各个函数的功能和程序的数据结构:

一、函数功能说明:

main函数如上,主要功能函数我们一一说一下(不按图中顺序,按逻辑顺序):

0x01.sub_400a49:创建记录索引表,具体就是分配一个大堆,堆里面存了各条记录存储区的指针(看后面分析就知道各条记录都malloc了一个堆来保存),就好像物业存了各个房间的钥匙,每把钥匙都对应了一个具体房间,挂钥匙的板子就是这个大堆,钥匙对应的房间就是存储各个记录的堆内存。

0x02.sub_400998:就是让你输入一个操作选项,没什么好说的,这里没有漏洞可以利用。

0x03.sub_400bc2:新建记录,进去以后的具体实现就是,让你输入记录内容长度和记录内容,然后检查长度有没有超最大限制,正常的化就malloc一个存储这条记录的堆块,然后以你输入的长度为标准一个一个把记录内容读进这个堆块。注意malloc堆块时有这样一个操作:  ,这表示分配堆块的大小是0x80的整数倍。最后就是把这条记录的有关信息写进索引表;当然开始的时候也检查了索引表中还有没有空间,这个大家应该看的懂,待会看数据结构分析的时候会理解的更好一点。

0x04.sub_400b14:输出功能,遍历索引表,打印所有记录的标号和记录内容,标号从0开始。

0x05.sub_400d87:编辑功能,依据上述记录标号找到相应记录,然后edit。

0x06.sub_400f7d:删除功能,仍旧依据上述标号找到相应记录,然后重置其索引表为未使用态,并free掉对应的记录堆块。

二、数据结构分析:

索引表的数据结构:

head不用管,是索引表大堆块的块首,不属于用户区;

max_size表示能存储的最大的记录数量,exist_num表示已有的记录个数;

再往后就是每三个数据构成一个索引项,索引项的结构体的三个数据分别代表:0/1是指该项有无记录引用,0是没有,1是有记录,size_user是记录的长度,ptr_heap是存储记录的堆块的用户区指针。

注意:

    这里有一点大家必须清楚,就是我们所说的记录编号,并不是将所有已经存在的记录进行编号,这个编号指的是,索引表中的每个索引项,无论是否存在记录,都进行线性的、固定的编号,这个编号在索引表建立后就有了,和记录是否存在无关,它是索引项的编号。

    这就好像高中不可以自己配钥匙的时候,宿管大爷的钥匙板上无论是否挂了钥匙,对应位置都会贴一个房间号标签,即使不挂钥匙也有,只不过没挂钥匙说明有人取走了,说明这个寝室里有人,对应过来就是,没挂钥匙相当于第一个结构体成员值为1,对应的记录堆块已经存在!

    但是也有一点不同,大家不要过度将两个例子对号入座,钥匙房间一一对应,钥匙还回(free)的时候从哪来放哪去,下次拿还是从同一个地方,但是假如开始有记录1234,你把2删了,下次新建的时候,根据代码逻辑可以知道是把索引表中原来索引项2的位置拿来放新的,因此这个索引表是允许碎片化的。

三、漏洞挖掘:

这样一来,结合各函数功能和索引表机制的原理,程序的数据处理思路也就清晰了,下面我们来找程序的漏洞:

0x01、即便堆漏洞接触不多,细心的读者可能也很容易发现第一处漏洞,漏洞出现在新建记录的那个函数里面,上图:

这个就是新建记录函数中实现读入记录内容的子函数,a2是用户输入的记录的长度,通过循环read读进a2个字符

注意,读进a2个字符!!不是长度为a2的字符串!!!

正常情况下长度为n的字符串,是有包含‘\x00‘结束符在内的n+1个ascii,但是这里并没有把结束符读进来,少了结束符,在打印记录时就不会正确的停下来,也就可以实现内存泄露!

0x02、本程序的核心漏洞,double free漏洞:

漏洞出现在记录删除函数中,我们仔细分析一下这个函数的逻辑实现就可以发现一个惊人的事实:在你输入一个标号后,程序并没有检查索引表中标号位置的索引项的第一个成员变量是否已经为0、也没有检查对应索引项的堆指针成员变量指向的堆内存是否已经被free,也就是说,即使这个索引项已经删过记录了,你还可以再删它一次,再像没事儿人一样对ptr_heap再进行一次free,而在程序代码中,free之后并没有将对应堆指针置空(点名批评!),这就对同一堆块free了两次,造成了double free漏洞!

(我知道你们不感兴趣但是还是要吐槽一下修补措施:哪怕你做到随手置空、检查标志位、检查ptr、或删除时清除索引项的ptr中的任何一点也不至于出现这个漏洞。。。)

0x03、巧夺天工unlink——“块内切割”大法:

这个方法也有人叫“堆块重构”技术

反正就是一通骚操作,违章改造房屋结构,是要犯法的。。。(画风秒变皮)

好了,我们正经来讲一下:

(为什么没有了呢?博主写累了,一次写不完啊....很快就更!别急!....未完待续)

原文地址:https://www.cnblogs.com/Magpie/p/9806572.html

时间: 2024-11-02 19:03:28

堆漏洞——实战double free和unlink漏洞的相关文章

安全工程师只能向拒绝服务漏洞 Parse Double 低头?

双十一的硝烟还未散尽,双十二就要来了.每逢节日期间,各大电商网站交易量暴涨,用户蜂拥而至抢购商品.那么这些电商平台的安全性如何? 据不完全统计,乌云平台自成立以来,已收集到的电商平台漏洞总数达 1169 个,其中 2015 年电商平台漏洞数为 414 个,相比于 2014 年,漏洞总数上涨了68.98%.对于安全工程师们来说,则需要加班加点保障网站的稳定性和安全性.数千亿的消费额,让所有的电商平台工程师,对安全问题不敢有一丝怠慢. 根据 Gartner 的报告,超过 80% 的攻击是以应用层为目

实战栈溢出:三个漏洞搞定一台路由器(转自长亭科技)

转:https://zhuanlan.zhihu.com/p/26271959 背景知识: 1.snprintf(),为函数原型int snprintf(char *str, size_t size, const char *format, ...),将可变个参数(...)按照format格式化成字符串,然后将其复制到str中. 函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值.与snprintf的返回值不同,sprintf的返回值是成功写入的字符串长度,此处需要谨慎处理! 2.st

漏洞大爆光:QQ漏洞、飞秋漏洞、360浏览器劫持…

?? 随着互联网应用的快速发展,信息安全已深入到诸多领域,前段时间发生的"Struts 2"漏洞及"心脏出血"漏洞影响了二亿中国网民的信息安全,原因是程序员缺少仔细的安全检查导致的.作为程序员,此时我们应该更加关注程序的安全性才对,但现实情况是程序员关注的依然是程序功能的实现,仍然忽视了程序的安全性,以至于很多程序都存在安全漏洞.下面是传智播客C/C++学院仅仅学习了5个月C/C++语言的学生发现的部分软件漏洞:(更多软件漏洞将会持续发布...) 1.飞秋远程溢出漏

怎么修复网站漏洞之metinfo远程SQL注入漏洞修补

2018年11月23日SINE网站安全检测平台,检测到MetInfo最新版本爆出高危漏洞,危害性较大,影响目前MetInfo 5.3版本到最新的 MetInfo 6.1.3版本,该网站漏洞产生的主要原因是MetInfo的上传代码里的参数值没有进行安全过滤,导致上传路径这里进行伪造路径,并可以插入恶意的代码,以及特殊字符进行上传图片到MetInfo的后台. MetInfo也叫米拓企业网站建站系统,是目前大多数企业网站使用的一个建站系统,整个系统采用的是php+mysql数据库作为基础架构,支持多功

通过代码审计找出网站中的XSS漏洞实战(三)

一.背景 笔者此前录制了一套XSS的视频教程,在漏洞案例一节中讲解手工挖掘.工具挖掘.代码审计三部分内容,准备将内容用文章的形式再次写一此,前两篇已经写完,内容有一些关联性,其中手工XSS挖掘篇地址为快速找出网站中可能存在的XSS漏洞实践(一)https://segmentfault.com/a/1190000016095198 本文主要记录通过代码审计的方式进行XSS漏洞挖掘,分为了找出关键位置,正向审计,反向审计三个部分,审计的系统为permeate渗透测试系统,测试系统的搭建可以参考笔者的

实战经验丨业务逻辑漏洞探索之活动类漏洞

活动类的漏洞大家一定听说过,比如之前拼多多APP出现重大BUG,用户可以在任何没有限制的情况下无限领取100元无门槛优惠券.据不完全统计,一晚上的时间直接导致了拼多多200多亿的优惠券面额损失. 其实很多平台都会通过参与活动赢取奖励的方式来吸引用户,或是使用资金.虚拟货币.积分等进行交易,然而如果这些功能没有设计好,会很容易造成重大的经济损失,比如像上述的拼多多案例. 那么今天我们就来学习一下业务逻辑漏洞探索之活动类漏洞的相关内容,希望对大家有所帮助. 注:本文中提供的例子均来自网络已公开测试的

缓冲区溢出漏洞实战(1)

目标软件:BlazeDVD Pro 版本号:7.0.0.0 系统:Windows xp,Win7,Win8 ------ 主要是Immunity Debugger mona.py插件的使用,此插件是Corelan Team的精品.设置mona.py工作路径: !mona config -set workingfolder c:\logs\%p 生成测试数据: #!/usr/bin/python from struct import pack   buffer = '\x41'*1000 try:

某网SQL注入漏洞实战

[email protected]:~# sqlmap -u http://dn.you.com/shop.php?id=10 -v 1 --dbs available databases [8]:[*] dntg[*] dntg2[*] dnweb[*] information_schema[*] mysql[*] performance_schema[*] test[*] ultrax [email protected]:~# sqlmap -u http://dn.you.com/shop

X-forwarded-for注入漏洞实战

1.掌握SQL注入的基本原理:2.了解服务器获取客户端IP的方式:3.了解SQL注入的工具使用: 随便输入用户名密码登录,提示有ip信息,根据题目的意思是信息是根据x-forwarded-for的纸变得,所以本题存在x-forwarded-for注入1.首先打开burp抓包,添加x-forwarded-for:*,将raw的信息存为txt文件,如下图所示,速度比较慢,请耐心等待 2:#sqlmap -r 1.txt --current-db --batch //爆出数据库3:#sqlmap -r