漏洞概要 关注数(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
厂商回复:
最新状态:
暂无