-
-
[原创]DEV-C++ 堆缓冲区溢出漏洞
-
发表于: 2014-3-27 11:12 3758
-
原创但是非首发,原文链接http://www.wooyun.org/bugs/wooyun-2010-046827
简要描述:
打开源代码时候未对数据格式大小进行检测,导致堆溢出,。载入特定构造的文件可以执行任意恶意代码(shellcode)
存在多种数据格式中,这里以.H格式来演示
详细说明:
触发漏洞文件
注意:一定要先关联.H文件,让程序以.H格式被打开。
C:\1.h
一大堆数据文件
文件内数据
define XXXX "111111111。。。。111"
很长很长,我构造的是56.0 KB
一定要足够的长
分析过程
覆盖前的某次操作:
00401C6C 53 push ebx ; EAX=02DD2070 ;要处理数据块的地址和大小 02DD2070 4C
00401C6D 3B05 10565900 cmp eax, dword ptr [595610] ; 02DBD1C8 和淹没后的大数据地址比较
00401C73 75 09 jnz short 00401C7E
。。。
。。。 ;计算要处理数据的开始地址和大小
00401C7E 8B50 04 mov edx, dword ptr [eax+4] ; [00DD2070+4]=02DD2070 地址
00401C81 8B48 08 mov ecx, dword ptr [eax+8] ; [00DD2070+8]=4c 大小
00401C84 81F9 00100000 cmp ecx, 1000
00401C8A 7F 38 jg short 00401CC4
00401C8C 3BC2 cmp eax, edx
00401C8E 75 17 jnz short 00401CA7
00401C90 85C9 test ecx, ecx
00401C92 79 03 jns short 00401C97
00401C94 83C1 03 add ecx, 3
要处理的数据(正常)
02DD2070 70 20 DD 02[70 20 DD 02][4C 00 00 00]41 63 63 65 p ?p ?L...Acce
02DD2080 73 73 20 76 69 6F 6C 61 74 69 6F 6E 20 61 74 20 ss violation at
02DD2090 61 64 64 72 65 73 73 20 25 70 20 69 6E 20 6D 6F address %p in mo
02DD20A0 64 75 6C 65 20 27 25 73 27 2E 20 25 73 20 6F 66 dule '%s'. %s of
02DD20B0 20 61 64 64 72 65 73 73 4C 00 00 00 17 00 00 00 addressL......
02DD20C0 24 8A 40 00 DC 20 DD 02 00 00 00 00 00 00 00 00 $夽.??........
我们的大数据
02DBD1C8 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD1D8 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD1E8 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD1F8 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD208 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
-----------------------------------------------------------------------------------
覆盖瞬间:
00401C6C 53 push ebx ;EAX=02DBD1C8 要处理数据的地址 (被覆盖了 成了地址31313131 地址31313131)
00401C6D 3B05 10565900 cmp eax, dword ptr [595610] ; 和淹没后的大数据地址比较 ;;[595610]=2DB4000
;
00401C73 75 09 jnz short 00401C7E
00401C75 8B50 04 mov edx, dword ptr [eax+4]
00401C78 8915 10565900 mov dword ptr [595610], edx
00401C7E 8B50 04 mov edx, dword ptr [eax+4] ;EDX=溢出后的31313131地址 ;
00401C81 8B48 08 mov ecx, dword ptr [eax+8] ;ECX=溢出后的31313131大小
00401C84 81F9 00100000 cmp ecx, 1000
00401CC4 8B00 mov eax, dword ptr [eax]
...
00401CC4 8B00 mov eax, dword ptr [eax] ;02DD0000
00401CC6 8902 mov dword ptr [edx], eax ;内存地址给edx, 溢出了 就是31313131了
00401CC8 8950 04 mov dword ptr [eax+4], edx
00401CCB 5B pop ebx
要处理的数据(被覆盖)
02DBD1C8 00 00 DD 02 31 31 31 31 31 31 31 31 31 31 31 31 ..?111111111111 ; 31313131
02DBD1D8 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD1E8 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD1F8 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD208 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD218 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD228 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD238 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD248 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DBD258 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DD0000 00 40 DB 02[C8 D1 DB 02]BC 20 00 00 31 31 31 31 .@?妊??..1111 ; 02dbd1c8
02DD0010 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DD0020 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DD0030 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DD0040 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DD0050 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 1111111111111111
02DB4000 31 31 31 31[00 00 DD 02]C0 11 00 00 32 32 32 32 1111..??..2222 ;02dd0000
02DB4010 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 2222222222222222
02DB4020 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 2222222222222222
02DB4030 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 2222222222222222
02DB4040 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 2222222222222222
02DB4050 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 2222222222222222
;
也就是说 数据地址 和数据大小(覆盖后的31313131)我们可控制
我们也就可以往数据A处写大小为B的数据。
A就是shellcode地址
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- FuzzingGames 1.0【以游戏之乐,学漏洞挖掘之道】 1481
- [推荐]漏挖行业如何破局?只有联合才能胜利! 1871
- [推荐]自动化漏洞挖掘-未知协议自动解析软件 2641
- [推荐]一种提高漏洞挖掘效果的思路—同源分析 2479
- [推荐]动态“模糊”测试介绍 2408