漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2013-046827
漏洞标题:DEV-C++ 堆缓冲区溢出漏洞
相关厂商:DEV C++ 4.9.9.2
漏洞作者: 光刃
提交时间:2013-12-23 18:19
修复时间:2014-03-23 18:19
公开时间:2014-03-23 18:19
漏洞类型:设计错误/逻辑缺陷
危害等级:高
自评Rank:20
漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
									2013-12-23:	细节已通知厂商并且等待厂商处理中
									2013-12-27:	厂商已经确认,细节仅向厂商公开
									2013-12-30:	细节向第三方安全合作伙伴开放
									2014-02-20:	细节向核心白帽子及相关领域专家公开
									2014-03-02:	细节向普通白帽子公开
									2014-03-12:	细节向实习白帽子公开
									2014-03-23:	细节向公众公开
								
简要描述:
打开源代码时候未对数据格式大小进行检测,导致堆溢出,。载入特定构造的文件可以执行任意恶意代码(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地址
这就是该漏洞的利用原理
修复方案:
检测大小
版权声明:转载请注明来源 光刃@乌云
漏洞回应
厂商回应:
危害等级:中
漏洞Rank:10
确认时间:2013-12-27 20:54
厂商回复:
最新状态:
暂无


 
                
 ( 核心白帽子 |			        Rank:1545 漏洞数:260        | ...........................................)
						( 核心白帽子 |			        Rank:1545 漏洞数:260        | ...........................................)