首页
社区
课程
招聘
[讨论]关于整型bug与堆溢出
发表于: 2013-7-12 10:00 3043

[讨论]关于整型bug与堆溢出

2013-7-12 10:00
3043
关于整型bug与堆溢出

整型bug比较栈溢出难发现,最近看到一个整型bug引起的堆溢出,遇到了一些常见问题,借机会和大家讨论:)

整型溢出是指由整型bug引起的溢出,通常以栈或堆溢出告终。整型溢出由长度比较引起。
堆溢出是指在可写内存区域(不在栈上)发生的溢出,通常认为是malloc()分配堆空间发生的溢出。
而溢出是指缓冲区复制数据过程中,覆盖了相邻缓冲区的数据,引起了内存问题。
上面的理解为个人归纳,许多书并没有直接给概念,欢迎大牛拍砖指正。

在论坛里看到的一篇关于CVE-2012-0177分析,是一个整型bug引起的堆溢出漏洞,原文地址:http://bbs.pediy.com/showthread.php?t=150206

整型bug发生在检查HeaderIndexEntry.Cch的大小,
由于没有检查下一个结构HeaderIndexEntry.Cch的大小,引起堆溢出。
原文截图:

图I 整型bug引起的堆溢出

帖子里给了漏洞溢出的效果,下面截了一张图。因为崩溃是由memcpy访问越界造成的,而不是因为覆盖了相邻数据块的数据。这里不是堆溢出发生的位置。

图II memcpy访问越界

堆溢出应该是发生在call sub_6091103B(图I中),复制下一个HeaderIndexEntry头数据的时候,覆盖了再下一个的HeaderIndexEntry头,补上一个截图:

图III 堆溢出示意图

1.如果堆溢出确实是覆盖下一个HeaderIndexEntry头数据造成(call sub_6091103B),崩溃为什么发生在memcpy呢?会不会sub_6091103B拷贝的时候,调用memcpy这个函数访问越界。
2.解析文件格式时是一个遍历的过程,常常遇到在调试过程中,调试器没有给出要解析数据的符号。怎么对照文件格式参考文档,查看当前正在解析的是什么结构呢?

手里没有poc,这个漏洞没法分析下去了,但常见问题出来了,估计许多人遇到过,希望经验牛前来拍砖!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
2
1、堆溢出不一定总会断在memcpy,但在漏洞分析中,断在memcpy往往是最原始的出错地址(多数情况下),比如设置page heap后,一般都会断在这里,最原始的异常场景更有利用于定位漏洞代码。

2、这种很难给出具体的方式,推荐几个方法:

(a)污点追踪分析:标记文件内容为污点,再使用ida 污点分析的相关插件来分析寄存器对应的文件内容,结合010editor文件格式分析脚本来定位文件结构。

(b)执行指令比对:记录正常文件与异常文件的执行指令(od、immdbg都有trace功能),然后再作代码diff,比对代码的差异性,再根据文件内容的差异性整体分析。

(c)条件消息断点:在一些可能导致漏洞的变量都设置条件消息断点,在log中记录他的值,不少变量都会被循环操作的,根据变量记录的结果,找到其中的规律来定位文件结构。

(d)假设法:有时分析漏洞真的是靠猜的,假设对应某个文件结构,再调试分析去证实。

(e)开源软件符号表加载:比如分析libpng漏洞,优先找个使用libpng且开源并提供有符号的软件,比如Firefox,分析libpng时直接使用firefox符号表去调试firefox就很容易定位结构,libpng函数也直接识别,或者你也可以直接编译libpng制作符号表。
2013-7-12 10:56
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢泉哥,调试时很有帮助,感谢留下经验!

欢迎其他牛发表看法!
2013-7-21 00:11
0
游客
登录 | 注册 方可回帖
返回
//