首页
社区
课程
招聘
[原创]DEV-C++ 堆缓冲区溢出漏洞
发表于: 2014-3-27 11:12 3758

[原创]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地址


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//