总结windows下堆溢出的三种利用方式.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
总结windows下堆溢出的三种利用方式

总结windows下堆溢出的三种利用方式.txt你站在那不要动!等我飞奔过去!  雨停了 天晴了 女人你慢慢扫屋 我为你去扫天下了    你是我的听说现在结婚很便宜,民政局9块钱搞定,我请你吧你个笨蛋啊遇到这种事要站在我后面!  跟我走总有一天你的名字会出现在我家的户口本上。   原文由Leven发在网络编程版: /bbs/index.php?act=SEf=3t=34455p=122380 总结windows下堆溢出的三种利用方式 1.利用RtlAllocHeap 这是ISNO提到的,看这个例子 main (int argc, char *argv[]) { char *buf1, *buf2; char s[] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x03\x00\x05\x00\x00\x01\x08\x00\x11\x11\x11\x11\x21\x21\x21\x21; buf1 = (char*)malloc (32); /* 分配两块内存 */ memcpy (buf1, s, 32+16); /* 这里多复制16个字节 */ buf2 = (char*)malloc (16); free (buf1); free (buf2); return 0; } 在给buf1完成malloc之后,返回的地址(buf1)是个指针,指向的内存分配情况是这样 buf1的管理结构(8bytes)|buf1真正可操作空间(32bytes)|下一个空闲堆的管理结构(8bytes)|两个双链表指针(8bytes) 在给buf2完成malloc之后,buf1指向的内存分配情况是这样 buf1的管理结构(8bytes)|buf1真正可操作空间(32bytes)|buf2的管理结构(8bytes)|buf2真正可操作空间(16bytes)|两个双链表指针(8bytes) 现在如果在buf2分配空间之前,buf1的memcpy操作溢出,并且覆盖了 下一个空闲堆的管理结构(8bytes)|两个双链表指针(8bytes) 共16个字节的时候,就会造成buf2的RtlAllocHeap操作异常。原因看RtlAllocHeap的这段代码 001B:77FCC453 8901 MOV [ECX],EAX 001B:77FCC455 894804 MOV [EAX+04],ECX 此时ECX指向两个双链表指针(8bytes)的后一个指针(0,EAX指向前一个指针(0。类似于 format string溢出,可以写任意数据到任意地址,这种情况比较简单,前提是在buf2分配空间之前buf1有溢出的机会 2.利用RtlFreeHeap的方式一 这是ilsy提到的,看例子 main (int argc, char *argv[]) { char *buf1, *buf2; char s[] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x03\x00\x05\x00\x00\x09; buf1 = (char*)malloc (32); /* 分配两块内存 */ buf2 = (char*)malloc (16); memcpy (buf1, s, 32+6); /* 这里多复制6个字节 */ free (buf1); free (buf2); return 0; } 由于buf1多复制了6个字节,这6个字节会覆盖掉buf2的管理结构,在free(buf2)时会发生异常。只要我们精心构造这个6个字节就可以达到目的 先看看8字节管理结构的定义(从windows源码中找到) typedef struct _HEAP_ENTRY { // // This field gives the size of the current block in allocation // granularity units. (i.e. Size HEAP_GRANULARITY_SHIFT // equals the size in bytes). // // Except if this is part of a virtual alloc block then this // value is the difference between the commit size in the virtual // alloc entry and the what

文档评论(0)

wannian118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档