소스를 확인해보면 입력한 값은 int형으로 casting이 되고, D1에 값을 p7이라는 c 프로그램에 인자로 넘겨줍니다.

그 결과와 D2값이 동일하면 문제가 해결됩니다.



우선 p7.c 코드를 확인해 봅니다. (URL로 이동)

  ① D1의 값을 atoi()함수로 int 형변환 후 i변수 선언.

  ② i값이 음수면 nono() 실행

  ③ i값에 +5

  ④ i값이 4보다 크면 nono() 실행

  ⑤ i값이 5보다 작으면 i값 printf


결론은 처음에는 음수였다가 +5한 값이 4이하이면서 1이 아니면 해결이 됩니다.

하지만 가장 작은 값인 0을 입력해도 +5를 하면 ④번으로 인해 실패하게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
void nono();
 
int main(int argc,char **argv){
    int i;
    if(argc!=2){nono();}
    i=atoi(argv[1]);
    if(i<0){nono();}
    i=i+5;
    if(i>4){nono();}
    if(i<5){printf("%d",i);}
    return 0;
}
 
void nono(){
  printf("%d",1);
  exit(1);
}
cs



처음 문제를 열었을 때 32bit application에서 integer type에 관해 알고 있는지 물어봅니다.

32bit에서 int는 4byte로 값의 범위가 정해져 있습니다.


이때 2,147,483,647이상의 값을 입력하게 되면 error나는 것이 아니라 Overflow로 음수가 됩니다.

(ex. 2147483647 + 1 = -2147483648)

이것을 이용해서 문제를 해결 할 수 있습니다.



최대 값인 2,147,483,647을 D1에 입력하면 ②번의 양수를 검사하는 부분을 통과하게 되고,

+5를 하게 되면 Overflow가 발생하여 -2,147,483,644이 됩니다.


그리고 해당 값을 보낼 때 input tag에서 글자 수 제한(9)을 두었는데 개발자 모드로 살~짝 바꿔주시면 됩니다.




[참고]

C언어 데이터 형식 범위: https://msdn.microsoft.com/ko-kr/library/s3f49ktz.aspx

'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] ip log table  (0) 2018.11.08
[WarGame] WTF_CODE  (0) 2018.11.05
[WarGame] tmitter  (0) 2018.11.01
[WarGame] img recovery  (0) 2018.10.31
[WarGame] pyc decomplie  (0) 2018.10.30



tmitter이라는 홈페이지가 나옵니다.

계정을 로그인 할 수 있는 버튼과 새로 가입할 수 있는 버튼이 하나씩 있습니다.



계정을 모르기 때문에 해당 페이지로 가보면 ID/PS 입력란이 있고 아무것도 알려주지 않습니다.

소스를 확인 하면 주석으로 admin으로 가입하라는 힌트가 하나 주어집니다.



기본적으로 admin으로 가입을 시도하면 다음과 같이 존재한다면서 아이디가 생성되지 않습니다.



SQL Injection으로 해보면 되지 않을까 생각에 다음과 같이 시도해도 싱글쿼터(') 앞에 \가 붙으면서 제 역할을 하지 못합니다.

아마 addslashes() 나 get_magic_quotes_gpc()가 사용되고 있는 것으로 생각됩니다.

(insert into table_name value('$id','$pw')이런 식으로 join하겠죠?)



하지만 멀티바이트를 사용하는 언어셋 환경이라면 싱글쿼터를 우회 할 수 있습니다.

%a1~%fe 중 하나를 싱글쿼터 앞에 붙여서 보내면 싱글쿼터와 합쳐져 하나의 문자로 인식되기 때문에 우회가 가능합니다.


그래서 burp suite로 중간에 해당 값을 바꿔서 보내면 가입이 완료됩니다.




근데 생각해보니 싱글쿼터가 하나가 남게 되는데 query error가 아닌가 보네요...?

#을 지우고 해도 join이 되었습니다...??? (알 수 없네요..)



원래 의도 풀이


다른 블로그를 확인해보니 DB의 문제를 이용한 풀이를 했었습니다.


사실 처음 화면에 왜 create 문을 보여주었는지 의아해 했는데...

id가 32글자라는 것이 중요한 힌트였습니다.


서버에서 처리할 때 trim을 이용해 앞뒤 공백을 지우게 되는데 이것을 이용해서

"admin                           1" 이런 식으로 1을 제외한 앞 부분까지 32글자를 공백으로 만들어 보내면

32글자까지만 인식하기에 admin으로 가입이 되는 문제였습니다.

'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] WTF_CODE  (0) 2018.11.05
[WarGame] php? c?  (0) 2018.11.02
[WarGame] img recovery  (0) 2018.10.31
[WarGame] pyc decomplie  (0) 2018.10.30
[WarGame] md5_compare  (0) 2018.10.30



어지러운 패턴의 연속으로 되어있는 배경이 보입니다.

우선 이미지를 얻기 위해 소스를 확인해 보시면 쉽게 얻을 수 있습니다.



HxD로 확인해 보면 맨 아래 부분에 tExtsoftware.Japng r119 라는 문구가 의심스럽습니다.

japng 검색해보면 png파일을 여러장의 이미지를 하나의 파일로 만들어 gif처럼 움직이는 이미지를 만들 수 있습니다.



japngEditor를 이용해서 해당 이미지를 열어보면 다음과 같이 두 가지의 이미지가 들어있는 것을 알 수 있습니다.

(cmd>java -jar japng-editor.jar)

각각의 이미지를 Export해서 보다 보면 QR CODE일 것이라는 생각이 듭니다.



하지만 QR CODE를 인식하려면 하나의 이미지로 만들어야 되는데 배경이 흰색이기에 겹치지 못합니다.

다양한 방법이 있겠지만 PhotoScape라는 프로그램을 이용해서 이미지의 투명도를 조절해 하나로 겹치게 만들 수 있습니다.



QR CODE Scanner로 문자열을 얻고 인증하면 key값을 획득할 수 있습니다.



'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] php? c?  (0) 2018.11.02
[WarGame] tmitter  (0) 2018.11.01
[WarGame] pyc decomplie  (0) 2018.10.30
[WarGame] md5_compare  (0) 2018.10.30
[WarGame] strcmp  (0) 2018.10.30



python에서 .pyc는 컴파일된 파일입니다.

문제 자체가 decomplie하라는 문제이기 때문에 해당 파일을 디컴파일 먼저 수행해야 합니다.



"Easy Python Decompiler" 프로그램을 통해 간단하게 수행할 수 있습니다.

해당 프로그램을 사용하면 .pyc_dis 파일이 생성되고 확장자를 py로 바꾸고 열어보면 코드를 확인 할 수 있습니다.



아래 코드의 flag가 답을 얻기 위해 찾아야 되는 값입니다.

그리고 현재 시간을 통해서 ok변수 값의 flag값이 만들어지고 입력한 flag값과 비교를 합니다.


그렇다면 모르는 flag값을 제외한 코드를 사용해서 flag값을 만들 수 있습니다.

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
# Embedded file name: bughela.py
import time
from sys import exit
from hashlib import sha512
 
def main():
    print 'import me :D'
 
def GIVE_ME_FLAG(flag):
    if flag[:43!= 'http://wargame.kr:8080/pyc_decompile/?flag=':
        die()
    flag = flag[43:]
    now = time.localtime(time.time())
    seed = time.strftime('%m/%d/HJEJSH', time.localtime())
    hs = sha512(seed).hexdigest()
    start = now.tm_hour % 3 + 1
    end = start * (now.tm_min % 30 + 10)
    ok = hs[start:end]
    if ok != flag:
        die()
    print 'GOOD!!!'
 
def die():
    print 'NOPE...'
    exit()
 
 
if __name__ == '__main__':
    main()
cs



최종적으로 아래 코드를 이용해서 flag값을 획득 할 수 있습니다.

하지만 서버 시간과 사용자pc의 시간이 달라 flag값이 제대로 되지 않을 수 있습니다.


서버 시간에 맞춰 pc시간을 조정해서 python코드를 실행하면 올바른 값을 얻을 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Embedded file name: bughela.py
import time
from sys import exit
from hashlib import sha512
 
def main():
    print 'import me :D'
    now = time.localtime(time.time())
    seed = time.strftime('%m/%d/HJEJSH', time.localtime())
    hs = sha512(seed).hexdigest()
    start = now.tm_hour % 3 + 1
    end = start * (now.tm_min % 30 + 10)
    ok = hs[start:end]
    print(ok)
 
if __name__ == '__main__':
    main()
cs




'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] tmitter  (0) 2018.11.01
[WarGame] img recovery  (0) 2018.10.31
[WarGame] md5_compare  (0) 2018.10.30
[WarGame] strcmp  (0) 2018.10.30
[WarGame] md5 password  (1) 2018.10.29




단순히 값을 비교하라는 문제입니다.

value1에는 알파벳 만을 사용해야 하고,

value2에는 숫자 만을 사용해서 md5값이 동일해야 합니다.



php md5 crash라고 검색을 해보면 아래 참고 사이트가 나오게 됩니다.

해당 사이트에서 md5의 숫자와 문자열의 값이 동일한 것에 대한 이야기가 나오니 확인해 보시면 됩니다.



[참고]

알파벳/숫자 md5 값 동일: https://news.ycombinator.com/item?id=9484757


'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] img recovery  (0) 2018.10.31
[WarGame] pyc decomplie  (0) 2018.10.30
[WarGame] strcmp  (0) 2018.10.30
[WarGame] md5 password  (1) 2018.10.29
[WarGame] login filtering  (0) 2018.10.29






strcmp에 관한 문제입니다.

strcmp에 취약점이 있는 문제로 해당 취약점을 알아야 풀 수 있습니다.


지금 $password는 rand()함수로 인해 값이 계속 변해서 정확한 password는 알 수 없습니다.


strcmp(a,b) 함수의 역할은 a가 작으면 음수, b가 작으면 양수, 같으면 0을 반환해주는 함수입니다.

0을 반환해야 문제가 풀리기 때문에 배열과 비교를 하면 0의 값을 띄워주는 취약점을 이용하면 됩니다.



 POST 방식으로 값이 날라가기 때문에 burp suite를 사용해 중간에 값을 바꿔줍니다.

password=1로 보내는 게 아니라 password[]=1로 보내서 배열 형식으로 보내주면 배열과 문자열을 비교하여 0의 값을 반환합니다.



[참고]

[PHP] strcmp 취약점을 이용한 인증 우회: http://hackability.kr/entry/PHP-strcmp-%EC%B7%A8%EC%95%BD%EC%A0%90%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%B8%EC%A6%9D-%EC%9A%B0%ED%9A%8C


'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] pyc decomplie  (0) 2018.10.30
[WarGame] md5_compare  (0) 2018.10.30
[WarGame] md5 password  (1) 2018.10.29
[WarGame] login filtering  (0) 2018.10.29
[WarGame] fly me to the moon  (0) 2018.10.28





보통 md5('value')로 hash값을 만들면 32자리 hex값으로 나오게 됩니다.

하지만 md5('value', true)로 hash값을 만들면 16자리 바이너리 형태로 나오게 됩니다.

바이너리 형태로 나오게 되면서 취약점이 발생합니다.


password='aaa'='bbb' 라는 식은 password='aaa' 부분이 false, bool 연산의 문자열은 false이기에 'bbb'도 false가 나와

true로 query가 작동하게 됩니다.


그렇다면 md5를 한 바이너리 값 중에서 '=' 라는 문자열이 나오게 되면 false + false = true 로 된다는 것입니다.



python으로 간단하게 hash를 생성하는 코드를 만들고 '=' 를 찾으면 띄워 주도록 만들었습니다.

(ascii code로 27은 싱글쿼터, 3d는 =입니다)

1
2
3
4
5
6
import hashlib
 
for password in range(1,99999999):
     md5_hash = hashlib.md5(str(password)).hexdigest()
     if '273d27' in md5_hash:
         print(password)
cs


여러 값들이 나오게 되는데 모든 값이 false/false가 되지 않는지 전부 되지는 않고, 몇몇 값들만 됩니다.


'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] md5_compare  (0) 2018.10.30
[WarGame] strcmp  (0) 2018.10.30
[WarGame] login filtering  (0) 2018.10.29
[WarGame] fly me to the moon  (0) 2018.10.28
[WarGame] QR CODE PUZZLE  (0) 2018.10.28




소스 코드에 맨 아래 주석으로 id/pw가 있었고 로그인에 성공하면 key값을 띄워주는 문제입니다.

  <!--

  you have blocked accounts.

  guest / guest
  blueh4g / blueh4g1234ps
  -->




SQL Injection을 이용하고 싶지만 mysql_real_escape_string()으로 싱글쿼터 앞에 \를 붙이기 때문에 사용하지 못합니다.

또한 우회 기법인 %a1~%fe를 싱글쿼터 앞에 붙여서 특정 문자열을 만드는 방법도 mysql_query("set names utf8")인 환경이기에 불가능 합니다.



SQL Injection 문제는 아니므로 다른 방식으로 풀어야 합니다.


이때 주목해야 할 상황은 php환경이라는 점이며 php는 대소문자 구분을 하지 못한다는 것을 알아야 합니다.

일반적으로 guest/guest로 로그인을 하면 아래와 같은 메시지가 나오게 됩니다.



하지만 php환경에서 대소문자 구분을 하지 않기 때문에 GUEST/guest라고 입력을 해도 로그인에 성공하며

$id=='guest' 부분도 대문자이기에 통과할 수 있습니다.


'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] strcmp  (0) 2018.10.30
[WarGame] md5 password  (1) 2018.10.29
[WarGame] fly me to the moon  (0) 2018.10.28
[WarGame] QR CODE PUZZLE  (0) 2018.10.28
[WarGame] flee button  (0) 2018.10.28



갤로그 같은 게임이 하나 나오게 됩니다.



게임을 깨기 위한 점수로 31337점이라는 터무니 없는 점수를 요구합니다.

열심히 해도 30점을 넘기기 쉽지 않으니 다른 해결 방법을 찾아야 합니다.



소스를 확인해보면 packed된 javascript를 발견할 수 있습니다.



javascript unpacker 사이트에서 unpack을 해보면 아래와 같은 코드를 얻을 수 있습니다.

해당 코드는 게임을 진행하기 위한 정보가 있으며, 물론 점수에 관한 내용도 있을 것입니다.

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
318
319
320
321
322
var _0x32bb=["\x6B\x69\x6C\x6C\x50\x6C\x61\x79\x65\x72","\x63\x68\x65\x63\x6B\x4C\x69\x66\x65","\x67\x65\x74\x53\x63\x6F\x72\x65","\x42\x69\x6E\x63\x53\x63\x6F\x72\x65","\x73\x68\x72\x69\x6E\x6B\x54\x75\x6E\x6E\x65\x6C","\x77\x69\x64\x74\x68\x54\x75\x6E\x6E\x65\x6C","\x6F\x62\x6A\x65\x63\x74","\x44\x6F\x20\x63\x68\x65\x61\x74\x69\x6E\x67\x2C\x20\x69\x66\x20\x79\x6F\x75\x20\x63\x61\x6E","\x77\x61\x72\x6E","\x6F\x66\x66\x73\x65\x74\x4C\x65\x66\x74","\x74\x75\x6E\x6E\x65\x6C","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x74\x6F\x70","","\x70\x78","\x63\x73\x73","\x64\x69\x73\x70\x6C\x61\x79","\x62\x6C\x6F\x63\x6B","\x65\x61\x63\x68","\x69\x6D\x67\x2E\x6C\x65\x66\x74\x5F\x77\x61\x6C\x6C","\x69\x6D\x67\x2E\x72\x69\x67\x68\x74\x5F\x77\x61\x6C\x6C","\x23\x68\x69\x67\x68\x5F\x73\x63\x6F\x72\x65\x73","\x72\x65\x6D\x6F\x76\x65","\x74\x61\x62\x6C\x65","\x6E\x6F\x6E\x65","\x64\x69\x76\x23\x73\x63\x6F\x72\x65\x5F\x74\x61\x62\x6C\x65","\x63\x6C\x69\x63\x6B","\x74\x65\x78\x74","\x73\x70\x61\x6E\x23\x73\x63\x6F\x72\x65","\x6C\x65\x66\x74","\x69\x6D\x67\x23\x73\x68\x69\x70","\x73\x6C\x6F\x77","\x66\x61\x64\x65\x49\x6E","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x35\x30\x25\x20","\x64\x69\x76\x23\x74\x75\x6E\x6E\x65\x6C","\x72\x61\x6E\x64\x6F\x6D","\x66\x6C\x6F\x6F\x72","\x75\x70\x64\x61\x74\x65\x54\x75\x6E\x6E\x65\x6C\x28\x29","\x66\x61\x64\x65\x4F\x75\x74","\x50\x4F\x53\x54","\x68\x69\x67\x68\x2D\x73\x63\x6F\x72\x65\x73\x2E\x70\x68\x70","\x74\x6F\x6B\x65\x6E\x3D","\x26\x73\x63\x6F\x72\x65\x3D","\x61\x6A\x61\x78","\x68\x74\x6D\x6C","\x70\x23\x77\x65\x6C\x63\x6F\x6D\x65","\x75\x70\x64\x61\x74\x65\x54\x6F\x6B\x65\x6E\x28\x29","\x74\x68\x78\x2C\x20\x43\x68\x72\x69\x73\x74\x69\x61\x6E\x20\x4D\x6F\x6E\x74\x6F\x79\x61","\x6D\x6F\x75\x73\x65\x6F\x76\x65\x72","\x23\x63\x68\x72\x69\x73\x74\x69\x61\x6E","\x6D\x6F\x75\x73\x65\x6F\x75\x74","\x72\x65\x61\x64\x79","\x43\x68\x72\x69\x73\x74\x69\x61\x6E\x20\x4D\x6F\x6E\x74\x6F\x79\x61","\x70\x61\x67\x65\x58","\x6D\x6F\x75\x73\x65\x6D\x6F\x76\x65","\x74\x6F\x6B\x65\x6E\x2E\x70\x68\x70","\x67\x65\x74"];
function secureGame()
    {
    var _0x8618x2=this;
    var _0x8618x3=true;
    function _0x8618x4()
        {
        _0x8618x3=false;
        return true
    };
    function _0x8618x5()
        {
        return _0x8618x3
    };
    this[_0x32bb[0]]=function()
        {
        _0x8618x4();
        return true
    };
    this[_0x32bb[1]]=function()
        {
        return _0x8618x5()
    };
    var _0x8618x6=31337;
    function _0x8618x7()
        {
        return _0x8618x6
    };
    function _0x8618x8()
        {
        if(_0x8618x3)
            {
            _0x8618x6++
        };
        return true
    };
    this[_0x32bb[2]]=function()
        {
        return _0x8618x7()
    };
    this[_0x32bb[3]]=function()
        {
        _0x8618x8();
        return true
    };
    var _0x8618x9=320;
    function _0x8618xa()
        {
        _0x8618x9-=20;
        return true
    };
    function _0x8618xb()
        {
        return _0x8618x9
    };
    this[_0x32bb[4]]=function()
        {
        _0x8618xa();
        return true
    };
    this[_0x32bb[5]]=function()
        {
        return _0x8618xb()
    }
};
var bg_val=0;
var rail_left=0;
var rail_right=500;
var ship_x=234;
var pos_x=234;
var c_s=0;
var c_r=0;
var c_w=0;
var t_state=0;
left_wall=new Array(20);
right_wall=new Array(20);
function initTunnel()
    {
    BTunnelGame=new secureGame();
    if(_0x32bb[6]==typeof console)
        {
        console[_0x32bb[8]](_0x32bb[7])
    };
    rail_left=document[_0x32bb[11]](_0x32bb[10])[_0x32bb[9]];
    rail_right+=rail_left;
    y=0;
    for(y=0;
    y<20;
    y++)
        {
        left_wall[y]=80;
        right_wall[y]=400
    };
    $(_0x32bb[19])[_0x32bb[18]](function(_0x8618x16)
        {
        y=_0x8618x16*25;
        $(this)[_0x32bb[15]](_0x32bb[12],_0x32bb[13]+y+_0x32bb[14]);
        $(this)[_0x32bb[15]](_0x32bb[16],_0x32bb[17])
    }
    );
    $(_0x32bb[20])[_0x32bb[18]](function(_0x8618x16)
        {
        y=_0x8618x16*25;
        $(this)[_0x32bb[15]](_0x32bb[12],_0x32bb[13]+y+_0x32bb[14]);
        $(this)[_0x32bb[15]](_0x32bb[16],_0x32bb[17])
    }
    );
    $(_0x32bb[25])[_0x32bb[26]](function()
        {
        $(_0x32bb[23])[_0x32bb[22]](_0x32bb[21]);
        $(_0x32bb[25])[_0x32bb[15]](_0x32bb[16],_0x32bb[24]);
        restartTunnel();
        updateTunnel()
    }
    )
};
function restartTunnel()
    {
    BTunnelGame=new secureGame();
    if(_0x32bb[6]==typeof console)
        {
        console[_0x32bb[8]](_0x32bb[7])
    };
    ship_x=234;
    c_s=0;
    c_r=0;
    c_w=0;
    $(_0x32bb[28])[_0x32bb[27]](_0x32bb[13]+0);
    $(_0x32bb[30])[_0x32bb[15]](_0x32bb[29],ship_x+_0x32bb[14]);
    y=0;
    for(y=0;
    y<20;
    y++)
        {
        left_wall[y]=80;
        right_wall[y]=400
    };
    $(_0x32bb[30])[_0x32bb[32]](_0x32bb[31]);
    $(_0x32bb[19])[_0x32bb[18]](function(_0x8618x16)
        {
        y=_0x8618x16*25;
        $(this)[_0x32bb[15]](_0x32bb[12],_0x32bb[13]+y+_0x32bb[14]);
        $(this)[_0x32bb[15]](_0x32bb[16],_0x32bb[17])
    }
    );
    $(_0x32bb[20])[_0x32bb[18]](function(_0x8618x16)
        {
        y=_0x8618x16*25;
        $(this)[_0x32bb[15]](_0x32bb[12],_0x32bb[13]+y+_0x32bb[14]);
        $(this)[_0x32bb[15]](_0x32bb[16],_0x32bb[17])
    }
    )
};
function updateTunnel()
    {
    bg_val=bg_val+2;
    if(bg_val>20)
        {
        bg_val=0
    };
    $(_0x32bb[35])[_0x32bb[15]](_0x32bb[33],_0x32bb[34]+bg_val+_0x32bb[14]);
    if(ship_x+32<500)
        {
        if(ship_x+46<pos_x)
            {
            ship_x+=4
        }
        else
            {
            if(ship_x+16<pos_x)
                {
                ship_x+=2
            }
        }
    };
    if(ship_x>0)
        {
        if(ship_x-14>pos_x)
            {
            ship_x-=4
        }
        else
            {
            if(ship_x+16>pos_x)
                {
                ship_x-=2
            }
        }
    };
    $(_0x32bb[30])[_0x32bb[15]](_0x32bb[29],ship_x+_0x32bb[14]);
    c_r++;
    if(c_r>60)
        {
        c_r=0;
        t_state=Math[_0x32bb[37]](Math[_0x32bb[36]]()*2)
    };
    if(left_wall[0]<10)
        {
        t_state=1
    }
    else
        {
        if(right_wall[0]>470)
            {
            t_state=0
        }
    };
    y=0;
    for(y=20;
    y>0;
    y--)
        {
        left_wall[y]=left_wall[y-1];
        right_wall[y]=right_wall[y-1]
    };
    if(t_state==0)
        {
        left_wall[0]-=3
    };
    if(t_state==1)
        {
        left_wall[0]+=3
    };
    right_wall[0]=left_wall[0]+BTunnelGame[_0x32bb[5]]();
    $(_0x32bb[19])[_0x32bb[18]](function(_0x8618x16)
        {
        $(this)[_0x32bb[15]](_0x32bb[29],_0x32bb[13]+left_wall[_0x8618x16]+_0x32bb[14])
    }
    );
    $(_0x32bb[20])[_0x32bb[18]](function(_0x8618x16)
        {
        $(this)[_0x32bb[15]](_0x32bb[29],_0x32bb[13]+right_wall[_0x8618x16]+_0x32bb[14])
    }
    );
    if(BTunnelGame[_0x32bb[5]]()>=120)
        {
        c_w++;
        if(c_w>100)
            {
            c_w=0;
            BTunnelGame[_0x32bb[4]]();
            left_wall[0]+=10
        }
    };
    c_s++;
    if(c_s>20)
        {
        c_s=0;
        BTunnelGame.BincScore();
        $(_0x32bb[28])[_0x32bb[27]](_0x32bb[13]+BTunnelGame[_0x32bb[2]]())
    };
    if(ship_x<=left_wall[18]+20||ship_x+32>=right_wall[18])
        {
        BTunnelGame[_0x32bb[0]]()
    };
    if(BTunnelGame[_0x32bb[1]]())
        {
        setTimeout(_0x32bb[38],10)
    }
    else
        {
        $(_0x32bb[30])[_0x32bb[39]](_0x32bb[31]);
        $(_0x32bb[19])[_0x32bb[15]](_0x32bb[16],_0x32bb[24]);
        $(_0x32bb[20])[_0x32bb[15]](_0x32bb[16],_0x32bb[24]);
        $[_0x32bb[44]](
            {
            type:_0x32bb[40],url:_0x32bb[41],data:_0x32bb[42]+token+_0x32bb[43]+BTunnelGame[_0x32bb[2]](),success:function(_0x8618x19)
                {
                showHighScores(_0x8618x19)
            }
        }
        )
    }
};
function scoreUpdate()
    {
    return
};
function showHighScores(_0x8618x19)
    {
    $(_0x32bb[25])[_0x32bb[45]](_0x8618x19);
    $(_0x32bb[25])[_0x32bb[15]](_0x32bb[16],_0x32bb[17])
};
$(document)[_0x32bb[52]](function()
    {
    $(_0x32bb[46])[_0x32bb[15]](_0x32bb[16],_0x32bb[17]);
    updateToken();
    setInterval(_0x32bb[47],10000);
    $(_0x32bb[46])[_0x32bb[26]](function()
        {
        $(_0x32bb[46])[_0x32bb[15]](_0x32bb[16],_0x32bb[24]);
        initTunnel();
        updateTunnel()
    }
    );
    $(_0x32bb[50])[_0x32bb[49]](function()
        {
        $(this)[_0x32bb[45]](_0x32bb[48])
    }
    );
    $(_0x32bb[50])[_0x32bb[51]](function()
        {
        $(this)[_0x32bb[45]](temp)
    }
    )
}
);
var temp=_0x32bb[53];
$(document)[_0x32bb[55]](function(_0x8618x1d)
    {
    pos_x=_0x8618x1d[_0x32bb[54]]-rail_left
}
);
var token=_0x32bb[13];
function updateToken()
    {
    $[_0x32bb[57]](_0x32bb[56],function(_0x8618x20)
        {
        token=_0x8618x20
    }
    )
};
cs



그중 변수를 선언하는 var _0x32bb 를 먼저 확인 해봅니다.

모두 hex코드로 변환되어 있으니 python을 이용하면 간단하게 확인할 수 있습니다.



유심히 보면 %score= 라는 부분이 신경 쓰입니다.

_0x32bb[43]이 해당 부분이고 소스 코드에서 찾아보면 아래 부분에 있습니다.

_0x32bb[2] 부분이 score라는 것을 알 수 있고 찾아가 봅니다.

1
2
3
4
5
6
7
$[_0x32bb[44]](
{
    type:_0x32bb[40],url:_0x32bb[41],data:_0x32bb[42]+token+_0x32bb[43]+BTunnelGame[_0x32bb[2]](),success:function(_0x8618x19)
    {
        showHighScores(_0x8618x19)
    }
})
cs



_0x32bb[2]은 _0x8618x7() 함수의 값을 가져오고, _0x8618x7() 함수는 _0x8618x6의 값을 return 합니다.

해당 값이 0으로 설정이 되어서 게임을 시작할 때 0점으로 시작하게 됩니다.


해당 값을 31337로 설정해 두고 console에 javascript를 실행하면 게임이 시작할 때 31337점으로 시작해 게임을 클리어 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
var _0x8618x6=0;
 
function _0x8618x7()
{
    return _0x8618x6
};
 
this[_0x32bb[2]]=function()
{
    return _0x8618x7()
};
cs



'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] md5 password  (1) 2018.10.29
[WarGame] login filtering  (0) 2018.10.29
[WarGame] QR CODE PUZZLE  (0) 2018.10.28
[WarGame] flee button  (0) 2018.10.28
[WarGame] already got  (0) 2018.10.28



QR CODE PUZZLE 게임이 있습니다.

다 맞추면 되는지도 모르는 문제를 푸는 것은 의미가 없습니다..



소스를 확인해 보시면 함수가 있는데 unescape()로 의심이 가는 문구가 있습니다.

URL 인코딩 되어있어 디코딩을 해보면 URL이 하나 나오게 되고 해당 URL로 이동하면 완성된 QR CODE가 나오게 됩니다.



해당 QR CODE를 QR CODE READER로 읽어보면 또 하나의 URL이 나오고 해당 URL에는 KEY값이 있습니다.



'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] md5 password  (1) 2018.10.29
[WarGame] login filtering  (0) 2018.10.29
[WarGame] fly me to the moon  (0) 2018.10.28
[WarGame] flee button  (0) 2018.10.28
[WarGame] already got  (0) 2018.10.28

+ Recent posts