首页
社区
课程
招聘
1
[原创]2017CTF秋-第三题分析
发表于: 2017-10-28 15:42 4262

[原创]2017CTF秋-第三题分析

ccfer 活跃值
16
2017-10-28 15:42
4262
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
因为exe有重定位表,为了方便读者阅读分析代码,先用pe编辑工具把exe的重定位表地址rv清0
程序中有很多检测,但检测到异常后,都会调用一个共同入口0042E086来处理,因此只要在0042E086处改一个字节ret直接返回就可以了
 
ida打开exe,从GetDlgItemTextA的参考入手找到读取输入的地方,并对后面的流程做个注释:
.text:00435061                 push    401h            ; cchMax
.text:00435066                 lea     eax, [ebp+String]
.text:0043506C                 push    eax             ; lpString
.text:0043506D                 push    3E9h            ; nIDDlgItem
.text:00435072                 mov     ecx, [ebp+hDlg]
.text:00435075                 push    ecx             ; hDlg
.text:00435076                 call    ds:GetDlgItemTextA            //读取输入
...
.text:004350A6                 lea     eax, [ebp+var_C30]
.text:004350AC                 push    eax
.text:004350AD                 push    400h
.text:004350B2                 lea     ecx, [ebp+String]
.text:004350B8                 push    ecx
.text:004350B9                 call    sub_42D267                //对输入做第一层base64解码
...
.text:004350DE                 lea     eax, [ebp+var_1038]
.text:004350E4                 push    eax
.text:004350E5                 push    400h
.text:004350EA                 lea     ecx, [ebp+var_C30]
.text:004350F0                 push    ecx
.text:004350F1                 call    sub_42D267                //对输入做第二层base64解码
.text:004350F6                 add     esp, 0Ch
.text:004350F9                 push    400h
.text:004350FE                 lea     eax, [ebp+var_1440]
.text:00435104                 push    eax
.text:00435105                 lea     ecx, [ebp+var_1038]
.text:0043510B                 push    ecx
.text:0043510C                 call    sub_42D96A                //摩尔斯电码解码,空格分隔,4个字符转成一个小写字母
.text:00435111                 add     esp, 0Ch
.text:00435114                 mov     [ebp+var_144C], 3
.text:0043511E                 lea     eax, [ebp+var_1474]
.text:00435124                 push    eax
.text:00435125                 mov     ecx, [ebp+var_144C]
.text:0043512B                 push    ecx
.text:0043512C                 lea     edx, [ebp+var_1038]
.text:00435132                 push    edx
.text:00435133                 call    sub_42DA78                //计算前3个字符的hash
.text:00435138                 add     esp, 0Ch
.text:0043513B                 mov     [ebp+var_1888], 0
.text:00435145                 jmp     short loc_435156
.text:00435147 loc_435147:
.text:00435147                 mov     eax, [ebp+var_1888]
.text:0043514D                 add     eax, 1
.text:00435150                 mov     [ebp+var_1888], eax
.text:00435156 loc_435156:
.text:00435156                 cmp     [ebp+var_1888], 20h
.text:0043515D                 jge     short loc_43518B
.text:0043515F                 mov     eax, [ebp+var_1888]
.text:00435165                 movzx   ecx, [ebp+eax+var_1474]
.text:0043516D                 push    ecx
.text:0043516E                 push    offset a02x     ; "%02x"
.text:00435173                 mov     edx, [ebp+var_1888]
.text:00435179                 lea     eax, [ebp+edx*2+var_187C]
.text:00435180                 push    eax
.text:00435181                 call    sub_42DF05                //hash结果转成16进制字符串
.text:00435186                 add     esp, 0Ch
.text:00435189                 jmp     short loc_435147
.text:0043518B loc_43518B:
...
.text:004351C0                 sub     esi, eax
.text:004351C2                 push    esi
.text:004351C3                 lea     eax, [ebp+var_187C]
.text:004351C9                 push    eax
.text:004351CA                 call    sub_42DB27                //hash串和输入的后64个字符比较
.text:004351CF                 add     esp, 0Ch
.text:004351D2                 test    eax, eax
.text:004351D4                 jnz     short loc_435214
.text:004351D6                 call    sub_42D0B4
.text:004351DB                 lea     eax, [ebp+var_1440]
.text:004351E1                 push    eax
.text:004351E2                 push    offset unk_49B000            //迷宫数据
.text:004351E7                 call    sub_42D9AB                //根据输入做迷宫寻路
.text:004351EC                 add     esp, 8
.text:004351EF                 movzx   ecx, al
.text:004351F2                 cmp     ecx, 1
.text:004351F5                 jnz     short loc_435214
.text:004351F7                 mov     esi, esp
.text:004351F9                 push    0               ; uType
.text:004351FB                 push    offset Caption  ; "CrackMe"
.text:00435200                 push    offset Text     ; "ok"
.text:00435205                 push    0               ; hWnd
.text:00435207                 call    ds:MessageBoxA
.text:0043520D                 cmp     esi, esp
 
摩尔斯电码解码4个字符一组,空格是分隔符,空格前加'/'转义表示空格本身,每4个字符查表0049B2A0处的数据表,按顺序对应a~z:
.-**
-...
-.-.
-..*
.***
..-.
--.*
....
..**
.---
-.-*
.-..
--**
-.**
---*
.--.
--.-
.-.*
...*
-***
..-*
...-
.--*
-..-
-.--
--..
 
大小是10*10的迷宫数据49B000,要求从左上角走到右上角,0是可走点,1是障碍,x是个暗桩导致死锁:
0 1 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0 0
1 0 0 0 0 0 1 0 1 1
1 1 1 1 1 0 1 0 x 1
1 0 0 0 1 0 1 0 0 1
1 0 1 0 0 0 1 0 1 1
1 0 1 1 1 1 1 0 0 1
1 0 0 0 0 1 1 1 0 0
1 1 1 1 0 0 0 0 1 0
1 1 1 1 1 1 1 0 0 0
 
迷宫走法是:
z    下
l    右
q    上
p    左
 
所以解题流程就清楚了:把迷宫路线用zlqp四个字符表示出来(注意末尾带个空格表示结束):
zlzllllzzzppqppzzzlllzlllzllqqpqpqqqqqllq
然后转成摩尔斯编码:
--.. .-.. --.. .-.. .-.. .-.. .-.. --.. --.. --.. .--. .--. --.- .--. .--. --.. --.. --.. .-.. .-.. .-.. --.. .-.. .-.. .-.. --.. .-.. .-.. --.- --.- .--. --.- .--. --.- --.- --.- --.- --.- .-.. .-.. --.-/
做两层base64:
TFMwdUxpQXVMUzR1SUMwdExpNGdMaTB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDMHRMaTRnTFMwdUxpQXVMUzB1SUM0dExTNGdMUzB1TFNBdUxTMHVJQzR0TFM0Z0xTMHVMaUF0TFM0dUlDMHRMaTRnTGkwdUxpQXVMUzR1SUM0dExpNGdMUzB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDNHRMaTRnTGkwdUxpQXRMUzR0SUMwdExpMGdMaTB0TGlBdExTNHRJQzR0TFM0Z0xTMHVMU0F0TFM0dElDMHRMaTBnTFMwdUxTQXRMUzR0SUM0dExpNGdMaTB1TGlBdExTNHRMeUE
后面加上hash得到答案:
TFMwdUxpQXVMUzR1SUMwdExpNGdMaTB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDMHRMaTRnTFMwdUxpQXVMUzB1SUM0dExTNGdMUzB1TFNBdUxTMHVJQzR0TFM0Z0xTMHVMaUF0TFM0dUlDMHRMaTRnTGkwdUxpQXVMUzR1SUM0dExpNGdMUzB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDNHRMaTRnTGkwdUxpQXRMUzR0SUMwdExpMGdMaTB0TGlBdExTNHRJQzR0TFM0Z0xTMHVMU0F0TFM0dElDMHRMaTBnTFMwdUxTQXRMUzR0SUM0dExpNGdMaTB1TGlBdExTNHRMeUEb92a72497b685c31013347a7276f371f8cf91085ab8322009bfed2df41d94f94
 
实际情况是,题目中迷宫判断有bug,遇到空格就会结束,判为成功,所以利用空格可以构造出无数的解来,甚至自己不加空格,程序都会自动从内存中一直向后找到一个空格为止。

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2022-7-27 02:13
最新回复 (3)
雪    币: 39
活跃值: (482)
能力值: ( LV9,RANK:155 )
在线值:
发帖
回帖
粉丝
2
膜拜大佬
2017-10-30 14:41
0
雪    币: 203
活跃值: (1274)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
3
膜拜大佬
2017-10-30 18:24
0
雪    币: 312
活跃值: (123)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
膜拜
2017-10-30 18:57
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册