请教堆缓冲区溢出 利用malloc,free来攻击的原理
网上资料比较少, 有些写得不太清楚。。。
希望大侠指导。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
网上资料比较少, 有些写得不太清楚。。。
希望大侠指导。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(8)
一样的道理。
相对来说,堆溢出比栈溢出难些,我以最简单的情况来说明下基本原理。
通常把malloc分配得到的数据称为堆块,每一个堆块包括块首和块身,malloc函数返回的指针就是指向块身地址,而在块身之前还有8字节的空间,称为块首。当块空闲时,里面包括了一些该块的信息及标志;而块被使用后,块首里面放的就是个链表指针了,指向前一个堆块和后一个堆块,它们统一由系统中的堆表来维护。
链表的结构如下:
struct list {
struct list next;
struct list prev;
};
当进行free堆块操作的时候,就会把该堆块从链表中卸下,假设指针v指向该堆块,则操作类似于:
v->next->prev = v->prev;
v->prev->next = v->next;
现在假设我们连续2次调用malloc(100),则这2个堆块通常是连续的,也就是说,第1个堆块的块身后紧接着是第2个堆块的块首。第1个堆块的空间只有100个字节,如果我们往里面复制了108个字节,则不就是正好覆盖了第2个堆块的块首吗?而这108个字节的内容是我们可以控制的,所以当free操作的时候,我们就得到了一个向任意内存地址写入任意数据的机会。
如果利用的好,就可以改变某个内存变量的值,甚至是堆栈中保存的函数返回地址,系统中接下来要调用的某个指针函数。这样,就达到了利用堆溢出来改变程序流向,进行攻击的目的。
如果LZ对安全感兴趣的话,我建议你看 王清 的《0DAY安全:软件漏洞分析技术》一书。
[ 本帖最后由 vxasm 于 2009-9-21 17:55 编辑 ]
another link:
http://www.phrack.org/issues.html?issue=57&id=9
好啊 谢谢各位了!
缓冲区溢出,一句两句不好说明白。
建议看一下 如何写安全的代码。
好像是这本书。有电子版的。里边说的非常详细
原理很简单:比如你在C里,定义了一个CHAR BUF[10]; 但是你又用MEMCPY, STRCPY 向里面COPY了20或者更多的数据,那么就是缓冲区溢出。后果呢,轻的程序跑飞,重的则是程序完全被黑客控制。
HEAP也是类似的原理。但是具体做起来就有很多技巧了。去找书吧。
给你一个关于缓冲区溢出最简单的例子
复制代码
谢谢 但我想知道的是原理
而且是堆的溢出 而不是栈的溢出
网上说可以利用 free() 中的unlink来处理 但怎么都不明白