본문 바로가기

CTF

[Codegate 2017] Goversing

Go 언어로 만들어진 바이너리다.

사용자 함수를보면 main_main, main_print_menu, main_Login, main_id_check, main_pw_check, main_id_pw_check, main_Print_FLAG, main_init 등이 있다.

여기서 중요한 부분은 Print FLAG, 와 main_id_pw_check 이다.

login을 하고 print flag를 선택하면 id_pw를 check 한 후에 id 와 pw 루틴이 해당 함수와 일치하면 플래그를 뿜는다.

최근에 hexray를 자제하고 어셈이랑 좀 익숙해지고 친숙해지려고 어셈으로만 분석을 시작했다.

사실 goversing 자체 바이너리는 go언어로 만들어진 바이너리가 그런지 hexray가 안되서 어차피 어셈으로 분석해야한다 ㅋㅋ..


[main_id_pw_check]

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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
Dump of assembler code for function main.id_pw_check:
   0x0000000000401b40 <+0>:    mov    rcx,QWORD PTR fs:0xfffffffffffffff8
   0x0000000000401b49 <+9>:    lea    rax,[rsp-0xc0]
   0x0000000000401b51 <+17>:    cmp    rax,QWORD PTR [rcx+0x10]
   0x0000000000401b55 <+21>:    jbe    0x4021f8 <main.id_pw_check+1720>
   0x0000000000401b5b <+27>:    sub    rsp,0x140
   0x0000000000401b62 <+34>:    mov    QWORD PTR [rsp+0x138],rbp
   0x0000000000401b6a <+42>:    lea    rbp,[rsp+0x138]
   0x0000000000401b72 <+50>:    xorps  xmm0,xmm0
   0x0000000000401b75 <+53>:    movups XMMWORD PTR [rsp+0x118],xmm0
   0x0000000000401b7d <+61>:    movups XMMWORD PTR [rsp+0x128],xmm0
   0x0000000000401b85 <+69>:    lea    rax,[rsp+0x20]
   0x0000000000401b8a <+74>:    mov    QWORD PTR [rsp+0x100],rax
   0x0000000000401b92 <+82>:    xor    ecx,ecx
   0x0000000000401b94 <+84>:    mov    rdx,rcx
   0x0000000000401b97 <+87>:    xor    ebx,ebx
   0x0000000000401b99 <+89>:    mov    QWORD PTR [rsp+0x98],rdx
   0x0000000000401ba1 <+97>:    mov    QWORD PTR [rsp+0xf0],rbx
   0x0000000000401ba9 <+105>:    mov    rsi,QWORD PTR [rsp+0x148]
   0x0000000000401bb1 <+113>:    mov    QWORD PTR [rsp],rsi
   0x0000000000401bb5 <+117>:    mov    rdi,QWORD PTR [rsp+0x150]
   0x0000000000401bbd <+125>:    mov    QWORD PTR [rsp+0x8],rdi
   0x0000000000401bc2 <+130>:    mov    QWORD PTR [rsp+0x10],rcx
   0x0000000000401bc7 <+135>:    call   0x43e600 <runtime.stringiter2>
   0x0000000000401bcc <+140>:    mov    rax,QWORD PTR [rsp+0x18]
   0x0000000000401bd1 <+145>:    mov    QWORD PTR [rsp+0xa0],rax
   0x0000000000401bd9 <+153>:    mov    ecx,DWORD PTR [rsp+0x20]
   0x0000000000401bdd <+157>:    test   rax,rax
   0x0000000000401be0 <+160>:    je     0x401d0e <main.id_pw_check+462>
   0x0000000000401be6 <+166>:    mov    rdx,QWORD PTR [rsp+0xf0]
   0x0000000000401bee <+174>:    mov    QWORD PTR [rsp+0x108],rdx
   0x0000000000401bf6 <+182>:    mov    rdx,QWORD PTR [rsp+0x98]
   0x0000000000401bfe <+190>:    mov    QWORD PTR [rsp+0x110],rdx
   0x0000000000401c06 <+198>:    mov    DWORD PTR [rsp+0x5c],ecx
   0x0000000000401c0a <+202>:    mov    QWORD PTR [rsp+0x118],0x0
   0x0000000000401c16 <+214>:    mov    QWORD PTR [rsp+0x120],0x0
   0x0000000000401c22 <+226>:    mov    QWORD PTR [rsp+0x128],0x0
   0x0000000000401c2e <+238>:    mov    QWORD PTR [rsp+0x130],0x0
   0x0000000000401c3a <+250>:    lea    rcx,[rip+0xa285f]        # 0x4a44a0
   0x0000000000401c41 <+257>:    mov    QWORD PTR [rsp],rcx
   0x0000000000401c45 <+261>:    lea    rcx,[rsp+0x108]
   0x0000000000401c4d <+269>:    mov    QWORD PTR [rsp+0x8],rcx
   0x0000000000401c52 <+274>:    mov    QWORD PTR [rsp+0x10],0x0
   0x0000000000401c5b <+283>:    call   0x40c750 <runtime.convT2E>
   0x0000000000401c60 <+288>:    mov    rax,QWORD PTR [rsp+0x20]
   0x0000000000401c65 <+293>:    mov    rcx,QWORD PTR [rsp+0x18]
   0x0000000000401c6a <+298>:    mov    QWORD PTR [rsp+0x118],rcx
   0x0000000000401c72 <+306>:    mov    QWORD PTR [rsp+0x120],rax
   0x0000000000401c7a <+314>:    lea    rax,[rip+0xa23df]        # 0x4a4060
   0x0000000000401c81 <+321>:    mov    QWORD PTR [rsp],rax
   0x0000000000401c85 <+325>:    lea    rax,[rsp+0x5c]
   0x0000000000401c8a <+330>:    mov    QWORD PTR [rsp+0x8],rax
   0x0000000000401c8f <+335>:    mov    QWORD PTR [rsp+0x10],0x0
   0x0000000000401c98 <+344>:    call   0x40c750 <runtime.convT2E>
   0x0000000000401c9d <+349>:    mov    rax,QWORD PTR [rsp+0x20]
   0x0000000000401ca2 <+354>:    mov    rcx,QWORD PTR [rsp+0x18]
   0x0000000000401ca7 <+359>:    mov    QWORD PTR [rsp+0x128],rcx
   0x0000000000401caf <+367>:    mov    QWORD PTR [rsp+0x130],rax
   0x0000000000401cb7 <+375>:    lea    rax,[rip+0xc0acd]        # 0x4c278b
   0x0000000000401cbe <+382>:    mov    QWORD PTR [rsp],rax
   0x0000000000401cc2 <+386>:    mov    QWORD PTR [rsp+0x8],0x6
   0x0000000000401ccb <+395>:    lea    rax,[rsp+0x118]
   0x0000000000401cd3 <+403>:    mov    QWORD PTR [rsp+0x10],rax
   0x0000000000401cd8 <+408>:    mov    QWORD PTR [rsp+0x18],0x2
   0x0000000000401ce1 <+417>:    mov    QWORD PTR [rsp+0x20],0x2
   0x0000000000401cea <+426>:    call   0x456f30 <fmt.Sprintf>
   0x0000000000401cef <+431>:    mov    rdx,QWORD PTR [rsp+0x30]
   0x0000000000401cf4 <+436>:    mov    rbx,QWORD PTR [rsp+0x28]
   0x0000000000401cf9 <+441>:    mov    rax,QWORD PTR [rsp+0x100]
   0x0000000000401d01 <+449>:    mov    rcx,QWORD PTR [rsp+0xa0]
   0x0000000000401d09 <+457>:    jmp    0x401b99 <main.id_pw_check+89>
   0x0000000000401d0e <+462>:    lea    rdi,[rsp+0xb0]
   0x0000000000401d16 <+470>:    lea    rsi,[rip+0xccb63]        # 0x4ce880 <main.statictmp_108>
   0x0000000000401d1d <+477>:    mov    QWORD PTR [rsp-0x10],rbp
   0x0000000000401d22 <+482>:    lea    rbp,[rsp-0x10]
   0x0000000000401d27 <+487>:    call   0x453924 <runtime.duffcopy+868>
   0x0000000000401d2c <+492>:    mov    rbp,QWORD PTR [rbp+0x0]
   0x0000000000401d30 <+496>:    xor    eax,eax
   0x0000000000401d32 <+498>:    lea    rcx,[rsp+0x58]
   0x0000000000401d37 <+503>:    xor    edx,edx
   0x0000000000401d39 <+505>:    xor    ebx,ebx
   0x0000000000401d3b <+507>:    mov    QWORD PTR [rsp+0xf8],rcx
   0x0000000000401d43 <+515>:    mov    QWORD PTR [rsp+0x68],rdx
   0x0000000000401d48 <+520>:    mov    QWORD PTR [rsp+0x70],rbx
   0x0000000000401d4d <+525>:    mov    rsi,QWORD PTR [rsp+0xf0]
   0x0000000000401d55 <+533>:    mov    QWORD PTR [rsp],rsi
   0x0000000000401d59 <+537>:    mov    rdi,QWORD PTR [rsp+0x98]
   0x0000000000401d61 <+545>:    mov    QWORD PTR [rsp+0x8],rdi
   0x0000000000401d66 <+550>:    mov    QWORD PTR [rsp+0x10],rax
   0x0000000000401d6b <+555>:    call   0x43e600 <runtime.stringiter2>
   0x0000000000401d70 <+560>:    mov    rcx,QWORD PTR [rsp+0x18]
   0x0000000000401d75 <+565>:    mov    QWORD PTR [rsp+0xa0],rcx
   0x0000000000401d7d <+573>:    mov    rdx,QWORD PTR [rsp+0x100]
   0x0000000000401d85 <+581>:    movsxd rbx,DWORD PTR [rdx]
   0x0000000000401d88 <+584>:    test   rcx,rcx
   0x0000000000401d8b <+587>:    je     0x401ff4 <main.id_pw_check+1204>
   0x0000000000401d91 <+593>:    mov    QWORD PTR [rsp],0x0
   0x0000000000401d99 <+601>:    mov    QWORD PTR [rsp+0x8],rbx
   0x0000000000401d9e <+606>:    call   0x43e450 <runtime.intstring>
   0x0000000000401da3 <+611>:    mov    rax,QWORD PTR [rsp+0x18]
   0x0000000000401da8 <+616>:    mov    rcx,QWORD PTR [rsp+0x10]
   0x0000000000401dad <+621>:    mov    QWORD PTR [rsp],rcx
   0x0000000000401db1 <+625>:    mov    QWORD PTR [rsp+0x8],rax
   0x0000000000401db6 <+630>:    call   0x46e8f0 <strconv.Atoi>
   0x0000000000401dbb <+635>:    mov    rax,QWORD PTR [rsp+0x10]
   0x0000000000401dc0 <+640>:    mov    QWORD PTR [rsp+0x88],rax
   0x0000000000401dc8 <+648>:    lea    rcx,[rsp+0xb8]
   0x0000000000401dd0 <+656>:    mov    QWORD PTR [rsp],rcx
   0x0000000000401dd4 <+660>:    lea    rcx,[rsp+0xb0]
   0x0000000000401ddc <+668>:    mov    QWORD PTR [rsp+0x8],rcx
   0x0000000000401de1 <+673>:    mov    QWORD PTR [rsp+0x10],0x18
   0x0000000000401dea <+682>:    call   0x453be0 <runtime.memmove>
   0x0000000000401def <+687>:    mov    rax,QWORD PTR [rsp+0x88]
   0x0000000000401df7 <+695>:    mov    QWORD PTR [rsp+0xb0],rax
   0x0000000000401dff <+703>:    mov    rcx,QWORD PTR [rsp+0xb8]
   0x0000000000401e07 <+711>:    xor    rcx,rax
   0x0000000000401e0a <+714>:    mov    rdx,QWORD PTR [rsp+0xc0]
   0x0000000000401e12 <+722>:    xor    rcx,rdx
   0x0000000000401e15 <+725>:    mov    rdx,QWORD PTR [rsp+0xc8]
   0x0000000000401e1d <+733>:    xor    rcx,rdx
   0x0000000000401e20 <+736>:    xor    rcx,0x1
   0x0000000000401e24 <+740>:    mov    QWORD PTR [rsp],rcx
   0x0000000000401e28 <+744>:    call   0x473210 <strconv.Itoa>
   0x0000000000401e2d <+749>:    mov    rax,QWORD PTR [rsp+0x10]
   0x0000000000401e32 <+754>:    mov    QWORD PTR [rsp+0x80],rax
   0x0000000000401e3a <+762>:    mov    rcx,QWORD PTR [rsp+0x8]
   0x0000000000401e3f <+767>:    mov    QWORD PTR [rsp+0xe8],rcx
   0x0000000000401e47 <+775>:    mov    rdx,QWORD PTR [rsp+0xb0]
   0x0000000000401e4f <+783>:    mov    rbx,QWORD PTR [rsp+0xb8]
   0x0000000000401e57 <+791>:    xor    rdx,rbx
   0x0000000000401e5a <+794>:    mov    rbx,QWORD PTR [rsp+0xc8]
   0x0000000000401e62 <+802>:    xor    rdx,rbx
   0x0000000000401e65 <+805>:    xor    rdx,0x1
   0x0000000000401e69 <+809>:    mov    QWORD PTR [rsp],rdx
   0x0000000000401e6d <+813>:    call   0x473210 <strconv.Itoa>
   0x0000000000401e72 <+818>:    mov    rax,QWORD PTR [rsp+0x10]
   0x0000000000401e77 <+823>:    mov    QWORD PTR [rsp+0x78],rax
   0x0000000000401e7c <+828>:    mov    rcx,QWORD PTR [rsp+0x8]
   0x0000000000401e81 <+833>:    mov    QWORD PTR [rsp+0xe0],rcx
   0x0000000000401e89 <+841>:    mov    rdx,QWORD PTR [rsp+0x88]
   0x0000000000401e91 <+849>:    xor    rdx,0x1
   0x0000000000401e95 <+853>:    mov    QWORD PTR [rsp],rdx
   0x0000000000401e99 <+857>:    call   0x473210 <strconv.Itoa>
   0x0000000000401e9e <+862>:    mov    rax,QWORD PTR [rsp+0x8]
   0x0000000000401ea3 <+867>:    mov    rcx,QWORD PTR [rsp+0x10]
   0x0000000000401ea8 <+872>:    mov    QWORD PTR [rsp],0x0
   0x0000000000401eb0 <+880>:    lea    rdx,[rip+0xc0542]        # 0x4c23f9
   0x0000000000401eb7 <+887>:    mov    QWORD PTR [rsp+0x8],rdx
   0x0000000000401ebc <+892>:    mov    QWORD PTR [rsp+0x10],0x1
   0x0000000000401ec5 <+901>:    mov    QWORD PTR [rsp+0x18],rax
   0x0000000000401eca <+906>:    mov    QWORD PTR [rsp+0x20],rcx
   0x0000000000401ecf <+911>:    mov    rax,QWORD PTR [rsp+0xe8]
   0x0000000000401ed7 <+919>:    mov    QWORD PTR [rsp+0x28],rax
   0x0000000000401edc <+924>:    mov    rax,QWORD PTR [rsp+0x80]
   0x0000000000401ee4 <+932>:    mov    QWORD PTR [rsp+0x30],rax
   0x0000000000401ee9 <+937>:    mov    rax,QWORD PTR [rsp+0xe0]
   0x0000000000401ef1 <+945>:    mov    QWORD PTR [rsp+0x38],rax
   0x0000000000401ef6 <+950>:    mov    rax,QWORD PTR [rsp+0x78]
   0x0000000000401efb <+955>:    mov    QWORD PTR [rsp+0x40],rax
   0x0000000000401f00 <+960>:    call   0x43dcf0 <runtime.concatstring4>
   0x0000000000401f05 <+965>:    mov    rax,QWORD PTR [rsp+0x50]
   0x0000000000401f0a <+970>:    mov    QWORD PTR [rsp+0x60],rax
   0x0000000000401f0f <+975>:    mov    rcx,QWORD PTR [rsp+0x48]
   0x0000000000401f14 <+980>:    mov    QWORD PTR [rsp+0xd0],rcx
   0x0000000000401f1c <+988>:    mov    rdx,QWORD PTR [rsp+0x68]
   0x0000000000401f21 <+993>:    lea    rbx,[rdx+0x1]
   0x0000000000401f25 <+997>:    mov    rsi,QWORD PTR [rsp+0x70]
   0x0000000000401f2a <+1002>:    cmp    rbx,rsi
   0x0000000000401f2d <+1005>:    jg     0x401f9e <main.id_pw_check+1118>
   0x0000000000401f2f <+1007>:    mov    rdi,QWORD PTR [rsp+0xf8]
   0x0000000000401f37 <+1015>:    mov    QWORD PTR [rsp+0xd8],rdi
   0x0000000000401f3f <+1023>:    mov    QWORD PTR [rsp+0x68],rbx
   0x0000000000401f44 <+1028>:    mov    QWORD PTR [rsp+0x70],rsi
   0x0000000000401f49 <+1033>:    shl    rdx,0x4
   0x0000000000401f4d <+1037>:    mov    QWORD PTR [rdi+rdx*1+0x8],rax
   0x0000000000401f52 <+1042>:    lea    rax,[rdi+rdx*1]
   0x0000000000401f56 <+1046>:    mov    r8d,DWORD PTR [rip+0x148013]        # 0x549f70 <runtime.writeBarrier>
   0x0000000000401f5d <+1053>:    test   r8b,r8b
   0x0000000000401f60 <+1056>:    jne    0x401f7c <main.id_pw_check+1084>
   0x0000000000401f62 <+1058>:    mov    QWORD PTR [rdi+rdx*1],rcx
   0x0000000000401f66 <+1062>:    mov    rax,QWORD PTR [rsp+0xa0]
   0x0000000000401f6e <+1070>:    mov    rcx,rdi
   0x0000000000401f71 <+1073>:    mov    rdx,rbx
   0x0000000000401f74 <+1076>:    mov    rbx,rsi
   0x0000000000401f77 <+1079>:    jmp    0x401d3b <main.id_pw_check+507>
   0x0000000000401f7c <+1084>:    mov    QWORD PTR [rsp],rax
   0x0000000000401f80 <+1088>:    mov    QWORD PTR [rsp+0x8],rcx
   0x0000000000401f85 <+1093>:    call   0x40fe50 <runtime.writebarrierptr>
   0x0000000000401f8a <+1098>:    mov    rbx,QWORD PTR [rsp+0x68]
   0x0000000000401f8f <+1103>:    mov    rsi,QWORD PTR [rsp+0x70]
   0x0000000000401f94 <+1108>:    mov    rdi,QWORD PTR [rsp+0xd8]
   0x0000000000401f9c <+1116>:    jmp    0x401f66 <main.id_pw_check+1062>
   0x0000000000401f9e <+1118>:    lea    rdi,[rip+0xa24fb]        # 0x4a44a0
   0x0000000000401fa5 <+1125>:    mov    QWORD PTR [rsp],rdi
   0x0000000000401fa9 <+1129>:    mov    rdi,QWORD PTR [rsp+0xf8]
   0x0000000000401fb1 <+1137>:    mov    QWORD PTR [rsp+0x8],rdi
   0x0000000000401fb6 <+1142>:    mov    QWORD PTR [rsp+0x10],rdx
   0x0000000000401fbb <+1147>:    mov    QWORD PTR [rsp+0x18],rsi
   0x0000000000401fc0 <+1152>:    mov    QWORD PTR [rsp+0x20],rbx
   0x0000000000401fc5 <+1157>:    call   0x439ec0 <runtime.growslice>
   0x0000000000401fca <+1162>:    mov    rdi,QWORD PTR [rsp+0x28]
   0x0000000000401fcf <+1167>:    mov    r8,QWORD PTR [rsp+0x30]
   0x0000000000401fd4 <+1172>:    mov    rsi,QWORD PTR [rsp+0x38]
   0x0000000000401fd9 <+1177>:    lea    rbx,[r8+0x1]
   0x0000000000401fdd <+1181>:    mov    rax,QWORD PTR [rsp+0x60]
   0x0000000000401fe2 <+1186>:    mov    rcx,QWORD PTR [rsp+0xd0]
   0x0000000000401fea <+1194>:    mov    rdx,QWORD PTR [rsp+0x68]
   0x0000000000401fef <+1199>:    jmp    0x401f37 <main.id_pw_check+1015>
   0x0000000000401ff4 <+1204>:    xor    eax,eax
   0x0000000000401ff6 <+1206>:    xor    ecx,ecx
   0x0000000000401ff8 <+1208>:    mov    QWORD PTR [rsp+0x90],rax
   0x0000000000402000 <+1216>:    mov    QWORD PTR [rsp+0xa8],rcx
   0x0000000000402008 <+1224>:    mov    rdx,QWORD PTR [rsp+0x68]
   0x000000000040200d <+1229>:    cmp    rax,rdx
   0x0000000000402010 <+1232>:    jge    0x4021ed <main.id_pw_check+1709>
   0x0000000000402016 <+1238>:    mov    rbx,rax
   0x0000000000402019 <+1241>:    shl    rax,0x4
   0x000000000040201d <+1245>:    mov    rsi,QWORD PTR [rsp+0xf8]
   0x0000000000402025 <+1253>:    mov    rdi,QWORD PTR [rsi+rax*1+0x8]
   0x000000000040202a <+1258>:    mov    rax,QWORD PTR [rsi+rax*1]
   0x000000000040202e <+1262>:    mov    QWORD PTR [rsp],rax
   0x0000000000402032 <+1266>:    mov    QWORD PTR [rsp+0x8],rdi
   0x0000000000402037 <+1271>:    mov    QWORD PTR [rsp+0x10],0x2
   0x0000000000402040 <+1280>:    mov    QWORD PTR [rsp+0x18],0x20
   0x0000000000402049 <+1289>:    call   0x46e290 <strconv.ParseInt>
   0x000000000040204e <+1294>:    mov    rcx,QWORD PTR [rsp+0x20]
   0x0000000000402053 <+1299>:    mov    rdx,QWORD PTR [rip+0x127fee]        # 0x52a048 <main.ID_KEY+8>
   0x000000000040205a <+1306>:    mov    rbx,QWORD PTR [rip+0x127fdf]        # 0x52a040 <main.ID_KEY>
   0x0000000000402061 <+1313>:    lea    rsi,[rdx-0x1]
   0x0000000000402065 <+1317>:    mov    rdi,QWORD PTR [rsp+0x90]
   0x000000000040206d <+1325>:    cmp    rdi,rsi
   0x0000000000402070 <+1328>:    jg     0x4020a6 <main.id_pw_check+1382>
   0x0000000000402072 <+1330>:    cmp    rdi,rdx
   0x0000000000402075 <+1333>:    jae    0x40209f <main.id_pw_check+1375>
   0x0000000000402077 <+1335>:    movzx  edx,BYTE PTR [rbx+rdi*1]
   0x000000000040207b <+1339>:    cmp    dl,cl
   0x000000000040207d <+1341>:    je     0x402095 <main.id_pw_check+1365>
   0x000000000040207f <+1343>:    mov    rax,0xffffffffffffffff
   0x0000000000402086 <+1350>:    lea    rdx,[rdi+0x1]
   0x000000000040208a <+1354>:    mov    rcx,rax
   0x000000000040208d <+1357>:    mov    rax,rdx
   0x0000000000402090 <+1360>:    jmp    0x401ff8 <main.id_pw_check+1208>
   0x0000000000402095 <+1365>:    mov    rax,QWORD PTR [rsp+0xa8]
   0x000000000040209d <+1373>:    jmp    0x402086 <main.id_pw_check+1350>
   0x000000000040209f <+1375>:    call   0x426350 <runtime.panicindex>
   0x00000000004020a4 <+1380>:    ud2    
   0x00000000004020a6 <+1382>:    mov    rax,0xffffffffffffffff
   0x00000000004020ad <+1389>:    mov    rcx,QWORD PTR [rip+0x127f94]        # 0x52a048 <main.ID_KEY+8>
   0x00000000004020b4 <+1396>:    cmp    rdi,rcx
   0x00000000004020b7 <+1399>:    je     0x4020c0 <main.id_pw_check+1408>
   0x00000000004020b9 <+1401>:    mov    rax,0xffffffffffffffff
   0x00000000004020c0 <+1408>:    mov    rcx,QWORD PTR [rsp+0x158]
   0x00000000004020c8 <+1416>:    mov    rdx,QWORD PTR [rsp+0x160]
   0x00000000004020d0 <+1424>:    mov    rbx,QWORD PTR [rsp+0x150]
   0x00000000004020d8 <+1432>:    mov    rsi,QWORD PTR [rsp+0x148]
   0x00000000004020e0 <+1440>:    xor    edi,edi
   0x00000000004020e2 <+1442>:    mov    QWORD PTR [rsp+0xa8],rax
   0x00000000004020ea <+1450>:    cmp    rdi,rdx
   0x00000000004020ed <+1453>:    jge    0x402173 <main.id_pw_check+1587>
   0x00000000004020f3 <+1459>:    mov    r8,QWORD PTR [rip+0x127f6e]        # 0x52a068 <main.PW_KEY+8>
   0x00000000004020fa <+1466>:    mov    r9,QWORD PTR [rip+0x127f5f]        # 0x52a060 <main.PW_KEY>
   0x0000000000402101 <+1473>:    lea    r10,[r8-0x1]
   0x0000000000402105 <+1477>:    cmp    rdi,r10
   0x0000000000402108 <+1480>:    jg     0x4021e4 <main.id_pw_check+1700>
   0x000000000040210e <+1486>:    movzx  r10d,BYTE PTR [rcx+rdi*1]
   0x0000000000402113 <+1491>:    test   rbx,rbx
   0x0000000000402116 <+1494>:    je     0x4021dd <main.id_pw_check+1693>
   0x000000000040211c <+1500>:    mov    rax,rdi
   0x000000000040211f <+1503>:    cmp    rbx,0xffffffffffffffff
   0x0000000000402123 <+1507>:    je     0x4021d5 <main.id_pw_check+1685>
   0x0000000000402129 <+1513>:    cqo    
   0x000000000040212b <+1515>:    idiv   rbx
   0x000000000040212e <+1518>:    cmp    rdx,rbx
   0x0000000000402131 <+1521>:    jae    0x4021ce <main.id_pw_check+1678>
   0x0000000000402137 <+1527>:    movzx  edx,BYTE PTR [rsi+rdx*1]
   0x000000000040213b <+1531>:    xor    rdx,r10
   0x000000000040213e <+1534>:    cmp    rdi,r8
   0x0000000000402141 <+1537>:    jae    0x4021ce <main.id_pw_check+1678>
   0x0000000000402147 <+1543>:    movzx  r8d,BYTE PTR [r9+rdi*1]
   0x000000000040214c <+1548>:    cmp    dl,r8b
   0x000000000040214f <+1551>:    je     0x4021c4 <main.id_pw_check+1668>
   0x0000000000402151 <+1553>:    mov    rax,0xffffffffffffffff
   0x0000000000402158 <+1560>:    inc    rdi
   0x000000000040215b <+1563>:    mov    r8,QWORD PTR [rsp+0x160]
   0x0000000000402163 <+1571>:    mov    rdx,r8
   0x0000000000402166 <+1574>:    mov    QWORD PTR [rsp+0xa8],rax
   0x000000000040216e <+1582>:    cmp    rdi,rdx
   0x0000000000402171 <+1585>:    jl     0x4020f3 <main.id_pw_check+1459>
   0x0000000000402173 <+1587>:    mov    rcx,QWORD PTR [rip+0x127eee]        # 0x52a068 <main.PW_KEY+8>
   0x000000000040217a <+1594>:    cmp    rdi,rcx
   0x000000000040217d <+1597>:    je     0x402186 <main.id_pw_check+1606>
   0x000000000040217f <+1599>:    mov    rax,0xffffffffffffffff
   0x0000000000402186 <+1606>:    cmp    rax,0xffffffffffffffff
   0x000000000040218a <+1610>:    jne    0x4021a8 <main.id_pw_check+1640>
   0x000000000040218c <+1612>:    mov    QWORD PTR [rsp+0x168],0x0
   0x0000000000402198 <+1624>:    mov    rbp,QWORD PTR [rsp+0x138]
   0x00000000004021a0 <+1632>:    add    rsp,0x140
   0x00000000004021a7 <+1639>:    ret    
   0x00000000004021a8 <+1640>:    mov    QWORD PTR [rsp+0x168],0x1
   0x00000000004021b4 <+1652>:    mov    rbp,QWORD PTR [rsp+0x138]
   0x00000000004021bc <+1660>:    add    rsp,0x140
   0x00000000004021c3 <+1667>:    ret    
   0x00000000004021c4 <+1668>:    mov    rax,QWORD PTR [rsp+0xa8]
   0x00000000004021cc <+1676>:    jmp    0x402158 <main.id_pw_check+1560>
   0x00000000004021ce <+1678>:    call   0x426350 <runtime.panicindex>
   0x00000000004021d3 <+1683>:    ud2    
   0x00000000004021d5 <+1685>:    xor    rdx,rdx
   0x00000000004021d8 <+1688>:    jmp    0x40212e <main.id_pw_check+1518>
   0x00000000004021dd <+1693>:    call   0x426450 <runtime.panicdivide>
   0x00000000004021e2 <+1698>:    ud2    
   0x00000000004021e4 <+1700>:    mov    rax,0xffffffffffffffff
   0x00000000004021eb <+1707>:    jmp    0x402173 <main.id_pw_check+1587>
   0x00000000004021ed <+1709>:    mov    rdi,rax
   0x00000000004021f0 <+1712>:    mov    rax,rcx
   0x00000000004021f3 <+1715>:    jmp    0x4020ad <main.id_pw_check+1389>
   0x00000000004021f8 <+1720>:    call   0x450af0 <runtime.morestack_noctxt>
   0x00000000004021fd <+1725>:    jmp    0x401b40 <main.id_pw_check>
cs

위 코드가 하는 일을 간단하게 요약해보면 

1. id, pw를 입력하고 Print_FLAG 선택했을 때 id, pw가 루틴과 알맞는지 검사

2. id를 2진수 값으로 나타내 저장

3. 해당 2진수 값을 이용해 암호화(xor) 등 을 한후 규칙대로 이어 붙여 마지막에 id_key와 비교

4. 입력한 id와 pw를 하나하나 xor하여 pw_key와 맞는지 비교

5. 3,4번에서 하나라도 틀리면 0xffffffff을 반환 맞다면 1을 반환

이제 의사코드 짜고 풀면된다.


[의사코드]

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
id_key = [7045477042066345403610617206175342061,
          015634547777045403156336647]
pw_key = [0x120x560x2e0x1B0x5C0x340x6A0x5D0x730x290x0F0x5B0x1C0x670x340x6F0x110x50,
          0x1E0x3A0x190x700x350x540x3F0x450x2D0x470x2E]
id = raw_input('input id : ')
pw = raw_input('input pw : ')
mem = ['0' for i in range(4)]
id_bin = ''
= 1
 
for i in id:
    tmp = bin(ord(i))[2:].rjust(8'0')
    id_bin += tmp
    for j in range(8):
        mem.append(tmp[j])
 
check = []
for i in range(4len(mem)):
    a1 = str(int(mem[i]) ^ int(mem[i - 1]) ^ int(mem[i - 2]) ^ int(mem[i - 3]) ^ 1)
    a2 = str(int(mem[i]) ^ int(mem[i - 1]) ^ int(mem[i - 3]) ^ 1)
    a3 = str(int(mem[i]) ^ 1)
    check.append('0' + a3 + a1 + a2)
 
for i in range(len(id_key)):
    if int(check[i], 2!= id_key[i]:
        c = 0xffffffff
 
for i in range(len(pw_key)):
    if ord(id[i % 8]) ^ ord(pw[i]) != pw_key[i]:
        c = 0xffffffff
 
if c == 1:
    print 'correct'
else:
    print 'wrong'
 
cs


[Solve]

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
id_key = [7045477042066345403610617206175342061,
          015634547777045403156336647]
pw_key = [0x120x560x2e0x1B0x5C0x340x6A0x5D0x730x290x0F0x5B0x1C0x670x340x6F0x110x50,
          0x1E0x3A0x190x700x350x540x3F0x450x2D0x470x2E]
id = ['0' for i in range(8)]
mem = ['0' for i in range(4)]
id_bin = ''
ID = ''
PW = ''
 
for length in range(len(id_key) / 8):
    for bf in range(32127):
        id[length] = chr(bf)
        mem = ['0' for i in range(4)]
        for i in id:
            tmp = bin(ord(i))[2:].rjust(8'0')
            for i in range(8):
                mem.append(tmp[i])
 
        check = []
        for i in range(4len(mem)):
            a1 = str(int(mem[i]) ^ int(mem[i - 1]) ^ int(mem[i - 2]) ^ int(mem[i - 3]) ^ 1)
            a2 = str(int(mem[i]) ^ int(mem[i - 1]) ^ int(mem[i - 3]) ^ 1)
            a3 = str(int(mem[i]) ^ 1)
            check.append('0' + a3 + a1 + a2)
 
        for i in range(8):
            if int(check[8 * length + i], 2== id_key[8 * length + i]:
                c = 1
            else:
                c = 0
                break
 
        if c == 1:
            c = 0
            ID += chr(bf)
            id[length] = chr(bf)
            break
 
print 'id : ' + ID
 
for i in range(len(pw_key)):
    PW += chr(pw_key[i] ^ ord(id[i % 8]))
 
print 'pw : ' + PW
#id : Admin@G0
#pw : S2Cr2t-m2Mb2r's_P4sSw0rd~!@.@
cs



'CTF' 카테고리의 다른 글

[Codegate final 2018] G0Crack  (0) 2018.04.06
[Codegate final 2018] betting  (0) 2018.04.06
[angstromctf 2017] Product Key  (0) 2018.03.18
[White Hacker League 2017] Medic  (0) 2018.03.09
[White Hacker League 2017] Ghost  (0) 2018.03.05