长城杯及第五空间部分wp

本文最后更新于:2021年9月24日 晚上

Reverse

funny_js

Quickjs,参考https://blog.d2x3.cn/kctf2020-%E7%AC%AC%E4%B8%89%E9%A2%98-%E5%AF%BB%E8%B8%AA%E8%A7%85%E6%BA%90.html

1
2
3
4
5
6
https://gitee.com/haloxxg/QuickJS/releases 下载对应版本
修改 quickjs.c,使其输出bytecode
make install 进行编译
echo "console.log('hello')" > ctf.js
./qjsc -o ctf ctf.js
./ctf

得到输出:

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
0000:  02 04                    4 atom indexes {
0002: 0e 63 6f 6e 73 6f 6c 65 string: 1"console"
000a: 06 6c 6f 67 string: 1"log"
000e: 0a 68 65 6c 6c 6f string: 1"hello"
0014: 0c 63 74 66 2e 6a 73 string: 1"ctf.js"
}
001b: 0e function {
001c: 00 06 00 9e 01 00 01 00
03 00 00 14 01 name: "<eval>"
args=0 vars=1 defargs=0 closures=0 cpool=0
stack=3 bclen=20 locals=1
vars {
0029: a0 01 00 00 00 name: "<ret>"
}
bytecode {
002e: 39 df 00 00 00 43 e0 00
00 00 04 e1 00 00 00 24
01 00 cf 28 at 1, fixup atom: console
at 6, fixup atom: log
at 11, fixup atom: hello
}
debug {
0042: c4 03 01 00 filename: "ctf.js"
}
}
ctf.js:1: function: <eval>
locals:
0: var <ret>
stack_size: 3
opcodes:
get_var console
get_field2 log
push_atom_value hello
call_method 1
set_loc0 0: "<ret>"
return

hello

测试成功,然后去分析程序找opcode。

image-20210922150612577

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
dump opcode,保存为c文件。

#include "quickjs-libc.h"

const uint32_t qjsc_ctf_size = 0x490;

const uint8_t qjsc_ctf[0x490] = {
0x02, 0x1B, 0x06, 0x72, 0x63, 0x34, 0x04, 0x73, 0x6E, 0x02, 0x69, 0x02, 0x6A, 0x02, 0x6B, 0x02,
0x6C, 0x02, 0x6D, 0x02, 0x6E, 0x04, 0x75, 0x6E, 0x06, 0x61, 0x72, 0x72, 0x0C, 0x63, 0x69, 0x70,
0x68, 0x65, 0x72, 0x2A, 0x32, 0x30, 0x32, 0x31, 0x71, 0x75, 0x69, 0x63, 0x6B, 0x6A, 0x73, 0x5F,
0x68, 0x61, 0x70, 0x70, 0x79, 0x67, 0x61, 0x6D, 0x65, 0x48, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x02, 0x73,
0x18, 0x66, 0x72, 0x6F, 0x6D, 0x43, 0x68, 0x61, 0x72, 0x43, 0x6F, 0x64, 0x65, 0x0A, 0x70, 0x72,
0x69, 0x6E, 0x74, 0x12, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x2E, 0x6A, 0x73, 0x08, 0x64, 0x61,
0x74, 0x61, 0x06, 0x6B, 0x65, 0x79, 0x06, 0x62, 0x6F, 0x78, 0x02, 0x78, 0x08, 0x74, 0x65, 0x6D,
0x70, 0x02, 0x79, 0x06, 0x6F, 0x75, 0x74, 0x08, 0x63, 0x6F, 0x64, 0x65, 0x14, 0x63, 0x68, 0x61,
0x72, 0x43, 0x6F, 0x64, 0x65, 0x41, 0x74, 0x08, 0x70, 0x75, 0x73, 0x68, 0x0E, 0x00, 0x06, 0x00,
0x9E, 0x01, 0x00, 0x01, 0x00, 0x20, 0x00, 0x08, 0xEB, 0x04, 0x01, 0xA0, 0x01, 0x00, 0x00, 0x00,
0x40, 0xDF, 0x00, 0x00, 0x00, 0x40, 0x40, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE1, 0x00, 0x00,
0x00, 0x00, 0x40, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE4,
0x00, 0x00, 0x00, 0x00, 0x40, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE6, 0x00, 0x00, 0x00, 0x00,
0x40, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE9, 0x00, 0x00,
0x00, 0x00, 0x40, 0xE1, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x00, 0x41, 0xDF, 0x00, 0x00, 0x00, 0x00,
0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE2, 0x00, 0x00,
0x00, 0x00, 0x3F, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE5,
0x00, 0x00, 0x00, 0x00, 0x3F, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE7, 0x00, 0x00, 0x00, 0x00,
0x3F, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE1, 0x00, 0x00,
0x00, 0x00, 0x04, 0xEA, 0x00, 0x00, 0x00, 0x11, 0x3A, 0xE7, 0x00, 0x00, 0x00, 0x0E, 0x04, 0xEB,
0x00, 0x00, 0x00, 0x11, 0x3A, 0xE0, 0x00, 0x00, 0x00, 0xCB, 0xC0, 0x96, 0x00, 0xC0, 0xE0, 0x00,
0xC0, 0xF4, 0x00, 0xBF, 0x44, 0xBF, 0x3D, 0xBF, 0x7D, 0xBF, 0x08, 0xC0, 0xEF, 0x00, 0xC0, 0xCB,
0x00, 0xC0, 0xFE, 0x00, 0xC0, 0xF1, 0x00, 0xBF, 0x71, 0xC0, 0xD5, 0x00, 0xC0, 0xB0, 0x00, 0xBF,
0x40, 0xBF, 0x6A, 0xBF, 0x67, 0xC0, 0xA6, 0x00, 0xC0, 0xB9, 0x00, 0xC0, 0x9F, 0x00, 0xC0, 0x9E,
0x00, 0xC0, 0xAC, 0x00, 0xBF, 0x09, 0xC0, 0xD5, 0x00, 0xC0, 0xEF, 0x00, 0xBF, 0x0C, 0xBF, 0x64,
0xC0, 0xB9, 0x00, 0xBF, 0x5A, 0xC0, 0xAE, 0x00, 0xBF, 0x6B, 0xC0, 0x83, 0x00, 0x26, 0x20, 0x00,
0xC0, 0xDF, 0x00, 0x4D, 0x20, 0x00, 0x00, 0x80, 0xBF, 0x7A, 0x4D, 0x21, 0x00, 0x00, 0x80, 0xC0,
0xE5, 0x00, 0x4D, 0x22, 0x00, 0x00, 0x80, 0xC0, 0x9D, 0x00, 0x4D, 0x23, 0x00, 0x00, 0x80, 0x11,
0x3A, 0xE8, 0x00, 0x00, 0x00, 0x0E, 0xC1, 0x01, 0x11, 0x3A, 0xE5, 0x00, 0x00, 0x00, 0xCB, 0xC1,
0x02, 0x11, 0x3A, 0xE6, 0x00, 0x00, 0x00, 0xCB, 0xB7, 0x11, 0x3A, 0xE4, 0x00, 0x00, 0x00, 0xCB,
0xB7, 0x11, 0x3A, 0xE3, 0x00, 0x00, 0x00, 0xCB, 0x39, 0xDF, 0x00, 0x00, 0x00, 0x39, 0xE0, 0x00,
0x00, 0x00, 0x39, 0xE7, 0x00, 0x00, 0x00, 0xF2, 0x11, 0x3A, 0xE9, 0x00, 0x00, 0x00, 0x0E, 0x06,
0xCB, 0xB7, 0x11, 0x3A, 0xE1, 0x00, 0x00, 0x00, 0x0E, 0x39, 0xE1, 0x00, 0x00, 0x00, 0x39, 0xE9,
0x00, 0x00, 0x00, 0xEB, 0xA5, 0xEC, 0x6E, 0x39, 0xE9, 0x00, 0x00, 0x00, 0x39, 0xE1, 0x00, 0x00,
0x00, 0x48, 0x11, 0x3A, 0xE2, 0x00, 0x00, 0x00, 0xCB, 0x39, 0xE2, 0x00, 0x00, 0x00, 0xBF, 0x38,
0xBF, 0x11, 0xA0, 0xB0, 0x11, 0x3A, 0xE4, 0x00, 0x00, 0x00, 0xCB, 0x06, 0xCB, 0x39, 0xE4, 0x00,
0x00, 0x00, 0x39, 0xE8, 0x00, 0x00, 0x00, 0x39, 0xE3, 0x00, 0x00, 0x00, 0x48, 0xAB, 0xEC, 0x0F,
0x39, 0xE5, 0x00, 0x00, 0x00, 0x93, 0x3A, 0xE5, 0x00, 0x00, 0x00, 0xCB, 0xEE, 0x0D, 0x39, 0xE6,
0x00, 0x00, 0x00, 0x93, 0x3A, 0xE6, 0x00, 0x00, 0x00, 0xCB, 0x39, 0xE3, 0x00, 0x00, 0x00, 0x93,
0x3A, 0xE3, 0x00, 0x00, 0x00, 0xCB, 0x39, 0xE1, 0x00, 0x00, 0x00, 0x93, 0x3A, 0xE1, 0x00, 0x00,
0x00, 0x0E, 0xEE, 0x86, 0x06, 0xCB, 0x39, 0xE5, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x00, 0x00, 0x00,
0xEB, 0xAB, 0xEC, 0x15, 0x39, 0xE6, 0x00, 0x00, 0x00, 0xB7, 0xAB, 0xEC, 0x0C, 0xC1, 0x03, 0x11,
0x3A, 0xE6, 0x00, 0x00, 0x00, 0xCB, 0xEE, 0x0A, 0xC1, 0x04, 0x11, 0x3A, 0xE6, 0x00, 0x00, 0x00,
0xCB, 0xC3, 0x11, 0x3A, 0xEC, 0x00, 0x00, 0x00, 0xCB, 0x06, 0xCB, 0x39, 0xE6, 0x00, 0x00, 0x00,
0xC1, 0x05, 0xA7, 0xEC, 0x3A, 0x39, 0xEC, 0x00, 0x00, 0x00, 0x39, 0x97, 0x00, 0x00, 0x00, 0x43,
0xED, 0x00, 0x00, 0x00, 0x39, 0x96, 0x00, 0x00, 0x00, 0x39, 0xE6, 0x00, 0x00, 0x00, 0xC1, 0x06,
0x9E, 0xF1, 0x24, 0x01, 0x00, 0x9F, 0x11, 0x3A, 0xEC, 0x00, 0x00, 0x00, 0xCB, 0x39, 0xE6, 0x00,
0x00, 0x00, 0xC1, 0x07, 0x9D, 0x11, 0x3A, 0xE6, 0x00, 0x00, 0x00, 0xCB, 0xEE, 0xBE, 0x39, 0xEE,
0x00, 0x00, 0x00, 0x39, 0xEC, 0x00, 0x00, 0x00, 0xF1, 0xCF, 0x28, 0xDE, 0x03, 0x01, 0x20, 0x00,
0x48, 0x01, 0x00, 0x4A, 0x52, 0x3F, 0x40, 0x00, 0x7C, 0x04, 0x30, 0x30, 0x2B, 0x2B, 0x77, 0x7B,
0x5D, 0x5D, 0x6C, 0x3F, 0x0E, 0x40, 0x3F, 0x4A, 0xB7, 0x30, 0x2B, 0x3F, 0xCB, 0x4E, 0x0D, 0x0E,
0x43, 0x06, 0x00, 0xBE, 0x03, 0x02, 0x08, 0x02, 0x05, 0x00, 0x00, 0xBB, 0x01, 0x0A, 0xE0, 0x03,
0x00, 0x01, 0x00, 0xE2, 0x03, 0x00, 0x01, 0x00, 0xE4, 0x03, 0x00, 0x00, 0x00, 0xC2, 0x03, 0x00,
0x01, 0x00, 0xE6, 0x03, 0x00, 0x02, 0x00, 0xE8, 0x03, 0x00, 0x03, 0x00, 0xEA, 0x03, 0x00, 0x04,
0x00, 0xEC, 0x03, 0x00, 0x05, 0x00, 0xEE, 0x03, 0x00, 0x06, 0x00, 0xC6, 0x03, 0x00, 0x07, 0x00,
0x39, 0x94, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xF1, 0xCB, 0xB7, 0xCC, 0xC8, 0xC0, 0x00, 0x01,
0xA5, 0xEC, 0x09, 0xC7, 0xC8, 0xC8, 0x4A, 0x95, 0x01, 0xEE, 0xF2, 0xB7, 0xCD, 0xB7, 0xCC, 0xC8,
0xC0, 0x00, 0x01, 0xA5, 0xEC, 0x2C, 0xC9, 0xC7, 0xC8, 0x48, 0x9F, 0xD4, 0x43, 0xF8, 0x00, 0x00,
0x00, 0xC8, 0xD4, 0xEB, 0x9E, 0x24, 0x01, 0x00, 0x9F, 0xC0, 0x00, 0x01, 0x9E, 0xCD, 0xC7, 0xC8,
0x48, 0xCE, 0xC7, 0xC8, 0x72, 0xC7, 0xC9, 0x48, 0x4A, 0xC7, 0xC9, 0xCA, 0x4A, 0x95, 0x01, 0xEE,
0xCF, 0xB7, 0xCD, 0xB7, 0xC5, 0x04, 0x26, 0x00, 0x00, 0xC5, 0x05, 0xB7, 0xCC, 0xC8, 0xD3, 0xEB,
0xA5, 0xEC, 0x56, 0xD3, 0x43, 0xF8, 0x00, 0x00, 0x00, 0xC8, 0x24, 0x01, 0x00, 0xC5, 0x06, 0xC9,
0xB8, 0x9F, 0xC0, 0x00, 0x01, 0x9E, 0xCD, 0xC4, 0x04, 0xC7, 0xC9, 0x48, 0x9F, 0xC0, 0x00, 0x01,
0x9E, 0xC5, 0x04, 0xC7, 0xC9, 0x48, 0xCE, 0xC7, 0xC9, 0x72, 0xC7, 0xC4, 0x04, 0x48, 0x4A, 0xC7,
0xC4, 0x04, 0xCA, 0x4A, 0xC7, 0xC9, 0x48, 0xC7, 0xC4, 0x04, 0x48, 0x9F, 0xC0, 0x00, 0x01, 0x9E,
0xC5, 0x07, 0xC4, 0x05, 0x43, 0xF9, 0x00, 0x00, 0x00, 0xC4, 0x06, 0xC7, 0xC4, 0x07, 0x48, 0xB0,
0x24, 0x01, 0x00, 0x0E, 0x95, 0x01, 0xEE, 0xA6, 0xC4, 0x05, 0x28, 0xDE, 0x03, 0x03, 0x19, 0x04,
0x35, 0x30, 0x17, 0x18, 0x0D, 0x30, 0x7B, 0x17, 0x26, 0x17, 0x19, 0x0D, 0x12, 0x1C, 0x2C, 0x40,
0x2B, 0x3F, 0x17, 0x2B, 0x1D, 0x4A, 0x5D, 0x17, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0xE8, 0x01, 0x07,
0x44, 0xB8, 0x90, 0xB5, 0x6B, 0x67, 0x80, 0x0A, 0xE8, 0x01, 0x07, 0x34, 0xA7, 0xB8, 0x48, 0x7F,
0x8D, 0xAF, 0x0A, 0x00, 0x0A, 0x28, 0x01, 0xFE, 0x0A, 0x28, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00
};

int main(int argc, char **argv)
{
JSRuntime *rt;
JSContext *ctx;
rt = JS_NewRuntime();
ctx = JS_NewContextRaw(rt);
JS_SetModuleLoaderFunc(rt, NULL, js_module_loader, NULL);
JS_AddIntrinsicBaseObjects(ctx);
JS_AddIntrinsicDate(ctx);
JS_AddIntrinsicEval(ctx);
JS_AddIntrinsicStringNormalize(ctx);
JS_AddIntrinsicRegExp(ctx);
JS_AddIntrinsicJSON(ctx);
JS_AddIntrinsicProxy(ctx);
JS_AddIntrinsicMapSet(ctx);
JS_AddIntrinsicTypedArrays(ctx);
JS_AddIntrinsicPromise(ctx);
JS_AddIntrinsicBigInt(ctx);
js_std_add_helpers(ctx, argc, argv);
js_std_eval_binary(ctx, qjsc_ctf, qjsc_ctf_size, 0);
js_std_loop(ctx);
JS_FreeContext(ctx);
JS_FreeRuntime(rt);
return 0;
}

然后编译
gcc funnyjs.c libquickjs.a -lm -ldl -o funnyjs

得到bytecode:

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
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
0000:  02 1b                    27 atom indexes {
0002: 06 72 63 34 string: 1"rc4"
0006: 04 73 6e string: 1"sn"
0009: 02 69 string: 1"i"
000b: 02 6a string: 1"j"
000d: 02 6b string: 1"k"
000f: 02 6c string: 1"l"
0011: 02 6d string: 1"m"
0013: 02 6e string: 1"n"
0015: 04 75 6e string: 1"un"
0018: 06 61 72 72 string: 1"arr"
001c: 0c 63 69 70 68 65 72 string: 1"cipher"
0023: 2a 32 30 32 31 71 75 69
63 6b 6a 73 5f 68 61 70
70 79 67 61 6d 65 string: 1"2021quickjs_happygame"
0039: 48 2a 2a 2a 2a 2a 2a 2a
2a 2a 2a 2a 2a 2a 2a 2a
2a 2a 2a 2a 2a 2a 2a 2a
2a 2a 2a 2a 2a 2a 2a 2a
2a 2a 2a 2a 2a string: 1"************************************"
005e: 02 73 string: 1"s"
0060: 18 66 72 6f 6d 43 68 61
72 43 6f 64 65 string: 1"fromCharCode"
006d: 0a 70 72 69 6e 74 string: 1"print"
0073: 12 73 6f 75 72 63 65 2e
6a 73 string: 1"source.js"
007d: 08 64 61 74 61 string: 1"data"
0082: 06 6b 65 79 string: 1"key"
0086: 06 62 6f 78 string: 1"box"
008a: 02 78 string: 1"x"
008c: 08 74 65 6d 70 string: 1"temp"
0091: 02 79 string: 1"y"
0093: 06 6f 75 74 string: 1"out"
0097: 08 63 6f 64 65 string: 1"code"
009c: 14 63 68 61 72 43 6f 64
65 41 74 string: 1"charCodeAt"
00a7: 08 70 75 73 68 string: 1"push"
}
00ac: 0e function {
00ad: 00 06 00 9e 01 00 01 00
20 00 08 eb 04 01 name: "<eval>"
args=0 vars=1 defargs=0 closures=0 cpool=8
stack=32 bclen=619 locals=1
vars {
00bb: a0 01 00 00 00 name: "<ret>"
}
bytecode {
00c0: 40 df 00 00 00 40 40 e0
00 00 00 00 40 e1 00 00
00 00 40 e2 00 00 00 00
40 e3 00 00 00 00 40 e4
00 00 00 00 40 e5 00 00
00 00 40 e6 00 00 00 00
40 e7 00 00 00 00 40 e8
00 00 00 00 40 e9 00 00
00 00 40 e1 00 00 00 00
c2 00 41 df 00 00 00 00
3f e0 00 00 00 00 3f e1
00 00 00 00 3f e2 00 00
00 00 3f e3 00 00 00 00
3f e4 00 00 00 00 3f e5
00 00 00 00 3f e6 00 00
00 00 3f e7 00 00 00 00
3f e8 00 00 00 00 3f e9
00 00 00 00 3f e1 00 00
00 00 04 ea 00 00 00 11
3a e7 00 00 00 0e 04 eb
00 00 00 11 3a e0 00 00
00 cb c0 96 00 c0 e0 00
c0 f4 00 bf 44 bf 3d bf
7d bf 08 c0 ef 00 c0 cb
00 c0 fe 00 c0 f1 00 bf
71 c0 d5 00 c0 b0 00 bf
40 bf 6a bf 67 c0 a6 00
c0 b9 00 c0 9f 00 c0 9e
00 c0 ac 00 bf 09 c0 d5
00 c0 ef 00 bf 0c bf 64
c0 b9 00 bf 5a c0 ae 00
bf 6b c0 83 00 26 20 00
c0 df 00 4d 20 00 00 80
bf 7a 4d 21 00 00 80 c0
e5 00 4d 22 00 00 80 c0
9d 00 4d 23 00 00 80 11
3a e8 00 00 00 0e c1 01
11 3a e5 00 00 00 cb c1
02 11 3a e6 00 00 00 cb
b7 11 3a e4 00 00 00 cb
b7 11 3a e3 00 00 00 cb
39 df 00 00 00 39 e0 00
00 00 39 e7 00 00 00 f2
11 3a e9 00 00 00 0e 06
cb b7 11 3a e1 00 00 00
0e 39 e1 00 00 00 39 e9
00 00 00 eb a5 ec 6e 39
e9 00 00 00 39 e1 00 00
00 48 11 3a e2 00 00 00
cb 39 e2 00 00 00 bf 38
bf 11 a0 b0 11 3a e4 00
00 00 cb 06 cb 39 e4 00
00 00 39 e8 00 00 00 39
e3 00 00 00 48 ab ec 0f
39 e5 00 00 00 93 3a e5
00 00 00 cb ee 0d 39 e6
00 00 00 93 3a e6 00 00
00 cb 39 e3 00 00 00 93
3a e3 00 00 00 cb 39 e1
00 00 00 93 3a e1 00 00
00 0e ee 86 06 cb 39 e5
00 00 00 39 e9 00 00 00
eb ab ec 15 39 e6 00 00
00 b7 ab ec 0c c1 03 11
3a e6 00 00 00 cb ee 0a
c1 04 11 3a e6 00 00 00
cb c3 11 3a ec 00 00 00
cb 06 cb 39 e6 00 00 00
c1 05 a7 ec 3a 39 ec 00
00 00 39 97 00 00 00 43
ed 00 00 00 39 96 00 00
00 39 e6 00 00 00 c1 06
9e f1 24 01 00 9f 11 3a
ec 00 00 00 cb 39 e6 00
00 00 c1 07 9d 11 3a e6
00 00 00 cb ee be 39 ee
00 00 00 39 ec 00 00 00
f1 cf 28 at 1, fixup atom: rc4
at 7, fixup atom: sn
at 13, fixup atom: i
at 19, fixup atom: j
at 25, fixup atom: k
at 31, fixup atom: l
at 37, fixup atom: m
at 43, fixup atom: n
at 49, fixup atom: un
at 55, fixup atom: arr
at 61, fixup atom: cipher
at 67, fixup atom: i
at 75, fixup atom: rc4
at 81, fixup atom: sn
at 87, fixup atom: i
at 93, fixup atom: j
at 99, fixup atom: k
at 105, fixup atom: l
at 111, fixup atom: m
at 117, fixup atom: n
at 123, fixup atom: un
at 129, fixup atom: arr
at 135, fixup atom: cipher
at 141, fixup atom: i
at 147, fixup atom: "2021quickjs_happygame"
at 153, fixup atom: un
at 159, fixup atom: "************************************"
at 165, fixup atom: sn
at 260, fixup atom: "32"
at 267, fixup atom: "33"
at 275, fixup atom: "34"
at 283, fixup atom: "35"
at 289, fixup atom: arr
at 298, fixup atom: m
at 307, fixup atom: n
at 315, fixup atom: l
at 323, fixup atom: k
at 329, fixup atom: rc4
at 334, fixup atom: sn
at 339, fixup atom: un
at 346, fixup atom: cipher
at 356, fixup atom: i
at 362, fixup atom: i
at 367, fixup atom: cipher
at 376, fixup atom: cipher
at 381, fixup atom: i
at 388, fixup atom: j
at 394, fixup atom: j
at 406, fixup atom: l
at 414, fixup atom: l
at 419, fixup atom: arr
at 424, fixup atom: k
at 433, fixup atom: m
at 439, fixup atom: m
at 447, fixup atom: n
at 453, fixup atom: n
at 459, fixup atom: k
at 465, fixup atom: k
at 471, fixup atom: i
at 477, fixup atom: i
at 487, fixup atom: m
at 492, fixup atom: cipher
at 501, fixup atom: n
at 513, fixup atom: n
at 524, fixup atom: n
at 532, fixup atom: s
at 540, fixup atom: n
at 550, fixup atom: s
at 555, fixup atom: String
at 560, fixup atom: fromCharCode
at 565, fixup atom: Number
at 570, fixup atom: n
at 584, fixup atom: s
at 590, fixup atom: n
at 599, fixup atom: n
at 607, fixup atom: print
at 612, fixup atom: s
}
debug {
032b: de 03 01 20 00 48 01 00
4a 52 3f 40 00 7c 04 30
30 2b 2b 77 7b 5d 5d 6c
3f 0e 40 3f 4a b7 30 2b
3f cb 4e 0d filename: "source.js"
}
cpool {
034f: 0e function {
0350: 43 06 00 be 03 02 08 02
05 00 00 bb 01 0a name: rc4
args=2 vars=8 defargs=2 closures=0 cpool=0
stack=5 bclen=187 locals=10
vars {
035e: e0 03 00 01 00 name: data
0363: e2 03 00 01 00 name: key
0368: e4 03 00 00 00 name: box
036d: c2 03 00 01 00 name: i
0372: e6 03 00 02 00 name: x
0377: e8 03 00 03 00 name: temp
037c: ea 03 00 04 00 name: y
0381: ec 03 00 05 00 name: out
0386: ee 03 00 06 00 name: code
038b: c6 03 00 07 00 name: k
}
bytecode {
0390: 39 94 00 00 00 c0 00 01
f1 cb b7 cc c8 c0 00 01
a5 ec 09 c7 c8 c8 4a 95
01 ee f2 b7 cd b7 cc c8
c0 00 01 a5 ec 2c c9 c7
c8 48 9f d4 43 f8 00 00
00 c8 d4 eb 9e 24 01 00
9f c0 00 01 9e cd c7 c8
48 ce c7 c8 72 c7 c9 48
4a c7 c9 ca 4a 95 01 ee
cf b7 cd b7 c5 04 26 00
00 c5 05 b7 cc c8 d3 eb
a5 ec 56 d3 43 f8 00 00
00 c8 24 01 00 c5 06 c9
b8 9f c0 00 01 9e cd c4
04 c7 c9 48 9f c0 00 01
9e c5 04 c7 c9 48 ce c7
c9 72 c7 c4 04 48 4a c7
c4 04 ca 4a c7 c9 48 c7
c4 04 48 9f c0 00 01 9e
c5 07 c4 05 43 f9 00 00
00 c4 06 c7 c4 07 48 b0
24 01 00 0e 95 01 ee a6
c4 05 28 at 1, fixup atom: Array
at 45, fixup atom: charCodeAt
at 101, fixup atom: charCodeAt
at 165, fixup atom: push
}
debug {
044b: de 03 03 19 04 35 30 17
18 0d 30 7b 17 26 17 19
0d 12 1c 2c 40 2b 3f 17
2b 1d 4a 5d 17 filename: "source.js"
}
}
source.js:3: function: rc4
args: data key
locals:
0: var box
1: var i
2: var x
3: var temp
4: var y
5: var out
6: var code
7: var k
stack_size: 5
opcodes:
get_var Array
push_i16 256
call1 1
put_loc0 0: box
push_0 0
put_loc1 1: i
12: get_loc1 1: i
push_i16 256
lt
if_false8 27
get_loc0 0: box
get_loc1 1: i
get_loc1 1: i
put_array_el
inc_loc 1: i
goto8 12
27: push_0 0
put_loc2 2: x
push_0 0
put_loc1 1: i
31: get_loc1 1: i
push_i16 256
lt
if_false8 81
get_loc2 2: x
get_loc0 0: box
get_loc1 1: i
get_array_el
add
get_arg1 1: key
get_field2 charCodeAt
get_loc1 1: i
get_arg1 1: key
get_length
mod
call_method 1
add
push_i16 256
mod
put_loc2 2: x
get_loc0 0: box
get_loc1 1: i
get_array_el
put_loc3 3: temp
get_loc0 0: box
get_loc1 1: i
to_propkey2
get_loc0 0: box
get_loc2 2: x
get_array_el
put_array_el
get_loc0 0: box
get_loc2 2: x
get_loc3 3: temp
put_array_el
inc_loc 1: i
goto8 31
81: push_0 0
put_loc2 2: x
push_0 0
put_loc8 4: y
array_from 0
put_loc8 5: out
push_0 0
put_loc1 1: i
93: get_loc1 1: i
get_arg0 0: data
get_length
lt
if_false8 184
get_arg0 0: data
get_field2 charCodeAt
get_loc1 1: i
call_method 1
put_loc8 6: code
get_loc2 2: x
push_1 1
add
push_i16 256
mod
put_loc2 2: x
get_loc8 4: y
get_loc0 0: box
get_loc2 2: x
get_array_el
add
push_i16 256
mod
put_loc8 4: y
get_loc0 0: box
get_loc2 2: x
get_array_el
put_loc3 3: temp
get_loc0 0: box
get_loc2 2: x
to_propkey2
get_loc0 0: box
get_loc8 4: y
get_array_el
put_array_el
get_loc0 0: box
get_loc8 4: y
get_loc3 3: temp
put_array_el
get_loc0 0: box
get_loc2 2: x
get_array_el
get_loc0 0: box
get_loc8 4: y
get_array_el
add
push_i16 256
mod
put_loc8 7: k
get_loc8 5: out
get_field2 push
get_loc8 6: code
get_loc0 0: box
get_loc8 7: k
get_array_el
xor
call_method 1
drop
inc_loc 1: i
goto8 93
184: get_loc8 5: out
return

0468: 0a bigint {
0469: 00 }
046a: 0a bigint {
046b: 00 }
046c: 0a bigint {
046d: e8 01 07 len=7
0470: 44 b8 90 b5 6b 67 80 }
0477: 0a bigint {
0478: e8 01 07 len=7
047b: 34 a7 b8 48 7f 8d af }
0482: 0a bigint {
0483: 00 }
0484: 0a bigint {
0485: 28 01 len=1
0487: fe }
0488: 0a bigint {
0489: 28 01 len=1
048b: fe }
}
}
source.js:1: function: <eval>
locals:
0: var <ret>
stack_size: 32
opcodes:
check_define_var rc4,64
check_define_var sn,0
check_define_var i,0
check_define_var j,0
check_define_var k,0
check_define_var l,0
check_define_var m,0
check_define_var n,0
check_define_var un,0
check_define_var arr,0
check_define_var cipher,0
check_define_var i,0
fclosure8 0: [bytecode rc4]
define_func rc4,0
define_var sn,0
define_var i,0
define_var j,0
define_var k,0
define_var l,0
define_var m,0
define_var n,0
define_var un,0
define_var arr,0
define_var cipher,0
define_var i,0
push_atom_value "2021quickjs_happygame"
dup
put_var un
drop
push_atom_value "************************************"
dup
put_var sn
put_loc0 0: "<ret>"
push_i16 150
push_i16 224
push_i16 244
push_i8 68
push_i8 61
push_i8 125
push_i8 8
push_i16 239
push_i16 203
push_i16 254
push_i16 241
push_i8 113
push_i16 213
push_i16 176
push_i8 64
push_i8 106
push_i8 103
push_i16 166
push_i16 185
push_i16 159
push_i16 158
push_i16 172
push_i8 9
push_i16 213
push_i16 239
push_i8 12
push_i8 100
push_i16 185
push_i8 90
push_i16 174
push_i8 107
push_i16 131
array_from 32
push_i16 223
define_field "32"
push_i8 122
define_field "33"
push_i16 229
define_field "34"
push_i16 157
define_field "35"
dup
put_var arr
drop
push_const8 1: 0n
dup
put_var m
put_loc0 0: "<ret>"
push_const8 2: 0n
dup
put_var n
put_loc0 0: "<ret>"
push_0 0
dup
put_var l
put_loc0 0: "<ret>"
push_0 0
dup
put_var k
put_loc0 0: "<ret>"
get_var rc4
get_var sn
get_var un
call2 2
dup
put_var cipher
drop
undefined
put_loc0 0: "<ret>"
push_0 0
dup
put_var i
drop
361: get_var i
get_var cipher
get_length
lt
if_false8 484
get_var cipher
get_var i
get_array_el
dup
put_var j
put_loc0 0: "<ret>"
get_var j
push_i8 56
push_i8 17
sub
xor
dup
put_var l
put_loc0 0: "<ret>"
undefined
put_loc0 0: "<ret>"
get_var l
get_var arr
get_var k
get_array_el
eq
if_false8 446
get_var m
post_inc
put_var m
put_loc0 0: "<ret>"
goto8 458
446: get_var n
post_inc
put_var n
put_loc0 0: "<ret>"
458: get_var k
post_inc
put_var k
put_loc0 0: "<ret>"
get_var i
post_inc
put_var i
drop
goto8 361
484: undefined
put_loc0 0: "<ret>"
get_var m
get_var cipher
get_length
eq
if_false8 520
get_var n
push_0 0
eq
if_false8 520
push_const8 3: 18071254662143010n
dup
put_var n
put_loc0 0: "<ret>"
goto8 529
520: push_const8 4: 24706849372394394n
dup
put_var n
put_loc0 0: "<ret>"
529: push_empty_string
dup
put_var s
put_loc0 0: "<ret>"
undefined
put_loc0 0: "<ret>"
539: get_var n
push_const8 5: 0n
gt
if_false8 606
get_var s
get_var String
get_field2 fromCharCode
get_var Number
get_var n
push_const8 6: 127n
mod
call1 1
call_method 1
add
dup
put_var s
put_loc0 0: "<ret>"
get_var n
push_const8 7: 127n
div
dup
put_var n
put_loc0 0: "<ret>"
goto8 539
606: get_var print
get_var s
call1 1
set_loc0 0: "<ret>"
return

Error...

分析bytecode:

image-20210922151847572

给un,sn赋值。

image-20210922151921989

给arr赋值,

image-20210922152017170

调用了rc4加密函数,结果存入cipher。

image-20210922152151648

cipher与56-17求异或,然后与arr进行比较,至此,解题思路就很明显了。

先与39异或,然后再进行rc4解密。

image-20210922152641657

魔鬼凯撒的RC4茶室

第一部分改过的凯撒,第二部分rc4,但也不完全是,还算了半天key,浪费时间,它只和一个字符进行了异或,直接爆破。

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
import string
import ctypes
s = "z8layn_b91_nb9ha1}kx"
str_upper = string.ascii_uppercase
str_num = string.digits
str_str = string.printable

res1 = ""
for j in range(len(s)):
for i in str_str:
ss = ord(i)
a = 0
if chr(ss) in str_upper:
a = (ss + 32 + 20 - 97) % 26 + 97
# if chr(ss) in str_lower:
# a = (i + 20 - 97) % 26 + 97
if chr(ss) in str_num:
a = (ss + 8 - 48) % 10 + 48
if a == ord(s[j]):
res1 += i
print(res1.lower())

key1 = hex(ctypes.c_uint32(-513026812).value)
key2 = hex(2028399278)
print(key1, key2)

tmp = [0x0D, 0x0A, 0xB2, 0xBF, 0xB9, 0xA5, 0xA6, 0xEF, 0xBF, 0xB1, 0xB3, 0xEF, 0xB0, 0xB9, 0x81, 0xEF, 0xAD, 0x81, 0xED, 0xB1, 0x81, 0xBB, 0xBF, 0xAD, 0xA7, 0x81]
for i in range(256):
result = ""
for j in range(len(tmp)):
result += chr(tmp[j] ^ i)
print(result)
#flag{x1aom1ng_1s_3o_easy_f0rget_h13_th1ng3}

第五空间uniapp

assert下找到app-service.js进行分析,使用pycharm进行格式化,发现了chacha20加密。

复制加密函数,调用decrypt进行解密:

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
var r = function (t, e, n) {
if ("undefined" === typeof n && (n = 0), !(t instanceof Uint8Array) || 32 !== t.length) throw new Error("Key should be 32 byte array!");
if (!(e instanceof Uint8Array) || 12 !== e.length) throw new Error("Nonce should be 12 byte array!");
this._rounds = 20, this._sigma = [1634760805, 857760878, 2036477234, 1797285236], this._param = [this._sigma[0], this._sigma[1], this._sigma[2], this._sigma[3], this._get32(t, 0), this._get32(t, 4), this._get32(t, 8), this._get32(t, 12), this._get32(t, 16), this._get32(t, 20), this._get32(t, 24), this._get32(t, 28), n, this._get32(e, 0), this._get32(e, 4), this._get32(e, 8)], this._keystream = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], this._byteCounter = 0
};
r.prototype._chacha = function () {
var t = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], e = 0, n = 0;
for (e = 0; e < 16; e++) t[e] = this._param[e];
for (e = 0; e < this._rounds; e += 2) this._quarterround(t, 0, 4, 8, 12), this._quarterround(t, 1, 5, 9, 13), this._quarterround(t, 2, 6, 10, 14), this._quarterround(t, 3, 7, 11, 15), this._quarterround(t, 0, 5, 10, 15), this._quarterround(t, 1, 6, 11, 12), this._quarterround(t, 2, 7, 8, 13), this._quarterround(t, 3, 4, 9, 14);
for (e = 0; e < 16; e++) t[e] += this._param[e], this._keystream[n++] = 255 & t[e], this._keystream[n++] = t[e] >>> 8 & 255, this._keystream[n++] = t[e] >>> 16 & 255, this._keystream[n++] = t[e] >>> 24 & 255
}, r.prototype._quarterround = function (t, e, n, r, o) {
t[o] = this._rotl(t[o] ^ (t[e] += t[n]), 16), t[n] = this._rotl(t[n] ^ (t[r] += t[o]), 12), t[o] = this._rotl(t[o] ^ (t[e] += t[n]), 8), t[n] = this._rotl(t[n] ^ (t[r] += t[o]), 7), t[e] >>>= 0, t[n] >>>= 0, t[r] >>>= 0, t[o] >>>= 0
}, r.prototype._get32 = function (t, e) {
return t[e++] ^ t[e++] << 8 ^ t[e++] << 16 ^ t[e] << 24
}, r.prototype._rotl = function (t, e) {
return t << e | t >>> 32 - e
}, r.prototype.encrypt = function (t) {
return this._update(t)
}, r.prototype.decrypt = function (t) {
return this._update(t)
}, r.prototype._update = function (t) {
if (!(t instanceof Uint8Array) || 0 === t.length) throw new Error("Data should be type of bytes (Uint8Array) and not empty!");
for (var e = new Uint8Array(t.length), n = 0; n < t.length; n++) 0 !== this._byteCounter && 64 !== this._byteCounter || (this._chacha(), this._param[12]++, this._byteCounter = 0), e[n] = t[n] ^ this._keystream[this._byteCounter++];
return e
};

p = [34, 69, 86, 242, 93, 72, 134, 226, 42, 138, 112, 56, 189, 53, 77, 178, 223, 76, 78, 221, 63, 40, 86, 231,121, 29, 154, 189, 204, 243, 205, 44, 141, 100, 13, 164, 35, 123]
i = new Uint8Array([0, 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])
a = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0])
s = 1
f= new r(i,a,s)
c = new Uint8Array(p)
console.log(f.decrypt(c));


然后进行异或:

1
2
3
4
5
6
7
8
9
10
Uint8Array = [
0, 10, 7, 1, 29, 83, 95, 3, 5, 84,
87, 87, 5, 86, 80, 95, 83, 95, 81, 95,
2, 4, 80, 5, 7, 82, 80, 81, 82, 0,
2, 84, 7, 95, 7, 7, 81, 27
]
flag = ""
for i in range(len(Uint8Array)):
flag += chr(Uint8Array[i] ^ 102)
print(flag)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!