@TOC
{}
在复现hitcon cclemon前,先复习一下python的字节码

python字节码

字节码格式:
源码行号 | 指令偏移量 | 指令符号 | 指令参数 | 实际参数值

python3.6之前 每条指令三个字节
python3.6开始每条指令两个字节(大部分)

常见的字节码指令

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
LOAD_GLOBAL#全局变量
LOAD_FAST#局部变量
LOAD_CONST#常量
LOAD_ATTR#对象中的属性

ROT_TWO #互换元素

STORE_FAST #保存局部变量
STORE_GLOBAL#保存全局变量
BUILD_LIST #创建列表

BUILD_SLICE #创建切片
BINARY_SUBSCR # 读取slice 的值
STORE_SUBSCR #slice 的值赋值给变量

SETUP_LOOP #用于开始一个循环 参数值代表循环结束点
JUMP_ABSOLUTE: #结束循环

POP_JUMP_IF_FALSE :#条件结果为 FALSE 则跳出 目标的偏移指令
JUMP_FORWARD # 直接跳转到目标指令
COMPARE_OP# 比较指令

PRINT_NEWLINE#printf
CALL_FUNCTION#调用函数

LOAD_CONST 2 (None)# void函数返回
RETURN_VALUE
>>> #循环或者if的跳转地点

实例:

1
2
3
4
5
6
7
8
9
10
import angr 

p=angr.Project("justamat",auto_load_libs=False)
state=p.factory.entry_state()
sm=p.factory.simulation_manager(state)
res=sm.explore(find=0x4047FD,avoid=0x404753)


if len(res.found) > 0:
print (res.found[0].posix.dumps(0))

python2的

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
1           0 LOAD_CONST               0 (-1)
3 LOAD_CONST 1 (None)
6 IMPORT_NAME 0 (angr)
9 STORE_NAME 0 (angr)

3 12 LOAD_NAME 0 (angr)
15 LOAD_ATTR 1 (Project)
18 LOAD_CONST 2 ('justamat')
21 LOAD_CONST 3 ('auto_load_libs')
24 LOAD_NAME 2 (False)
27 CALL_FUNCTION 257
30 STORE_NAME 3 (p)

4 33 LOAD_NAME 3 (p)
36 LOAD_ATTR 4 (factory)
39 LOAD_ATTR 5 (entry_state)
42 CALL_FUNCTION 0
45 STORE_NAME 6 (state)

5 48 LOAD_NAME 3 (p)
51 LOAD_ATTR 4 (factory)
54 LOAD_ATTR 7 (simulation_manager)
57 LOAD_NAME 6 (state)
60 CALL_FUNCTION 1
63 STORE_NAME 8 (sm)

6 66 LOAD_NAME 8 (sm)
69 LOAD_ATTR 9 (explore)
72 LOAD_CONST 4 ('find')
75 LOAD_CONST 5 (4212733)
78 LOAD_CONST 6 ('avoid')
81 LOAD_CONST 7 (4212563)
84 CALL_FUNCTION 512
87 STORE_NAME 10 (res)

8 90 LOAD_NAME 11 (len)
93 LOAD_NAME 10 (res)
96 LOAD_ATTR 12 (found)
99 CALL_FUNCTION 1
102 LOAD_CONST 8 (0)
105 COMPARE_OP 4 (>)
108 POP_JUMP_IF_FALSE 138

9 111 LOAD_NAME 10 (res)
114 LOAD_ATTR 12 (found)
117 LOAD_CONST 8 (0)
120 BINARY_SUBSCR
121 LOAD_ATTR 13 (posix)
124 LOAD_ATTR 14 (dumps)
127 LOAD_CONST 8 (0)
130 CALL_FUNCTION 1
133 PRINT_ITEM
134 PRINT_NEWLINE
135 JUMP_FORWARD 0 (to 138)
>> 138 LOAD_CONST 1 (None)
141 RETURN_VALUE

python3的

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
1           0 LOAD_CONST               0 (0)
2 LOAD_CONST 1 (None)
4 IMPORT_NAME 0 (angr)
6 STORE_NAME 0 (angr)

3 8 LOAD_NAME 0 (angr)
10 LOAD_ATTR 1 (Project)
12 LOAD_CONST 2 ('justamat')
14 LOAD_CONST 3 (False)
16 LOAD_CONST 4 (('auto_load_libs',))
18 CALL_FUNCTION_KW 2
20 STORE_NAME 2 (p)

4 22 LOAD_NAME 2 (p)
24 LOAD_ATTR 3 (factory)
26 LOAD_ATTR 4 (entry_state)
28 CALL_FUNCTION 0
30 STORE_NAME 5 (state)

5 32 LOAD_NAME 2 (p)
34 LOAD_ATTR 3 (factory)
36 LOAD_ATTR 6 (simulation_manager)
38 LOAD_NAME 5 (state)
40 CALL_FUNCTION 1
42 STORE_NAME 7 (sm)

6 44 LOAD_NAME 7 (sm)
46 LOAD_ATTR 8 (explore)
48 LOAD_CONST 5 (4212733)
50 LOAD_CONST 6 (4212563)
52 LOAD_CONST 7 (('find', 'avoid'))
54 CALL_FUNCTION_KW 2
56 STORE_NAME 9 (res)

8 58 LOAD_NAME 10 (len)
60 LOAD_NAME 9 (res)
62 LOAD_ATTR 11 (found)
64 CALL_FUNCTION 1
66 LOAD_CONST 0 (0)
68 COMPARE_OP 4 (>)
70 POP_JUMP_IF_FALSE 94

9 72 LOAD_NAME 12 (print)
74 LOAD_NAME 9 (res)
76 LOAD_ATTR 11 (found)
78 LOAD_CONST 0 (0)
80 BINARY_SUBSCR
82 LOAD_ATTR 13 (posix)
84 LOAD_ATTR 14 (dumps)
86 LOAD_CONST 0 (0)
88 CALL_FUNCTION 1
90 CALL_FUNCTION 1
92 POP_TOP
>> 94 LOAD_CONST 1 (None)
96 RETURN_VALUE

cclemon lemon字节码

又见southwood大哥手撕字节码,赶快学习一波~
和python的字节码类似,不过我门先要简单了解一下lemon语言和他的字节码
lemon-documentation
在这里插入图片描述
题目

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
0: const 26 ; <module 'src'> 
5: module 15 833
11: const 27 ; 68694329
16: store 0 0
19: const 28 ; w
24: define 0 0 0 0 59
33: load 1 0
36: const 29 ; 1259409
41: mul
42: const 30 ; 321625345
47: add
48: const 31 ; 4294967296
53: mod
54: dup
55: store 1 0
58: return
59: store 0 1
62: const 32 ; n
67: const 33 ; __init__
72: define 0 0 1 2 157
81: array 0
86: self
87: const 34 ; a
92: setattr
93: const 35 ; 0
98: store 0 1
101: load 0 1
104: load 0 0
107: lt
108: jz 151
113: self
114: const 34 ; a
119: getattr
120: const 36 ; append
125: getattr
126: load 1 1
129: call 0
131: call 1
133: pop
134: load 0 1
137: const 37 ; 1
142: add
143: store 0 1
146: jmp 101
151: const 38 ; nil
156: return
157: const 33 ; __init__
162: const 39 ; x
167: const 40 ; y
172: const 41 ; r
177: define 0 0 2 2 277
186: load 0 0
189: load 0 1
192: gt
193: jz 214
198: self
199: const 41 ; r
204: getattr
205: load 0 0
208: load 0 1
211: tailcall 2
213: return
214: load 0 0
217: load 0 1
220: lt
221: jz 271
226: self
227: const 42 ; s
232: getattr
233: load 0 1
236: load 0 0
239: call 2
241: pop
242: load 0 0
245: const 37 ; 1
250: add
251: store 0 0
254: load 0 1
257: const 37 ; 1
262: sub
263: store 0 1
266: jmp 214
271: const 38 ; nil
276: return
277: const 41 ; r
282: const 39 ; x
287: const 40 ; y
292: const 42 ; s
297: define 0 0 2 3 362
306: self
307: const 34 ; a
312: getattr
313: load 0 0
316: getitem
317: store 0 2
320: self
321: const 34 ; a
326: getattr
327: load 0 1
330: getitem
331: self
332: const 34 ; a
337: getattr
338: load 0 0
341: setitem
342: load 0 2
345: self
346: const 34 ; a
351: getattr
352: load 0 1
355: setitem
356: const 38 ; nil
361: return
362: const 42 ; s
367: const 39 ; x
372: const 40 ; y
377: const 43 ; val
382: const 44 ; o
387: define 0 0 3 4 494
396: load 0 0
399: load 0 1
402: gt
403: jz 427
408: self
409: const 44 ; o
414: getattr
415: load 0 2
418: load 0 0
421: load 0 1
424: tailcall 3
426: return
427: load 0 0
430: store 0 3
433: load 0 3
436: load 0 1
439: le
440: jz 488
445: self
446: const 34 ; a
451: getattr
452: load 0 3
455: getitem
456: load 0 2
459: bxor
460: self
461: const 34 ; a
466: getattr
467: load 0 3
470: setitem
471: load 0 3
474: const 37 ; 1
479: add
480: store 0 3
483: jmp 433
488: const 38 ; nil
493: return
494: const 44 ; o
499: const 45 ; A
504: class 8 0
507: store 0 2
510: const 46 ; 200000
515: store 0 7
518: load 0 2
521: load 0 7
524: call 1
526: store 0 8
529: const 35 ; 0
534: store 0 9
537: load 0 9
540: load 0 7
543: const 47 ; 5
548: mul
549: lt
550: jz 727
555: load 0 1
558: call 0
560: const 48 ; 3
565: mod
566: store 0 10
569: load 0 1
572: call 0
574: load 0 7
577: mod
578: store 0 11
581: load 0 1
584: call 0
586: load 0 7
589: mod
590: store 0 12
593: load 0 10
596: const 35 ; 0
601: eq
602: jz 630
607: load 0 8
610: const 41 ; r
615: getattr
616: load 0 12
619: load 0 11
622: call 2
624: pop
625: jmp 710
630: load 0 10
633: const 37 ; 1
638: eq
639: jz 667
644: load 0 8
647: const 42 ; s
652: getattr
653: load 0 12
656: load 0 11
659: call 2
661: pop
662: jmp 710
667: load 0 10
670: const 49 ; 2
675: eq
676: jz 710
681: load 0 1
684: call 0
686: store 0 13
689: load 0 8
692: const 44 ; o
697: getattr
698: load 0 13
701: load 0 12
704: load 0 11
707: call 3
709: pop
710: load 0 9
713: const 37 ; 1
718: add
719: store 0 9
722: jmp 537
727: const 35 ; 0
732: store 0 14
735: const 35 ; 0
740: store 0 9
743: load 0 9
746: load 0 7
749: lt
750: jz 802
755: load 0 14
758: load 0 8
761: const 34 ; a
766: getattr
767: load 0 9
770: getitem
771: load 0 9
774: const 37 ; 1
779: add
780: mul
781: add
782: store 0 14
785: load 0 9
788: const 37 ; 1
793: add
794: store 0 9
797: jmp 743
802: const 23 ; <function 'print'>
807: const 50 ; hitcon{
812: load 0 14
815: const 51 ; __string__
820: getattr
821: call 0
823: add
824: const 52 ; }
829: add
830: call 1
832: pop

翻译后

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
0: const 26 ; <module 'src'>
5: module 15 833

11: const 27 ; 68694329
16: store 0 0 #存入全局变量0

19: const 28 ; w
24: define 0 0 0 0 59
33: load 1 0
36: const 29 ; 1259409
41: mul
42: const 30 ; 321625345
47: add
48: const 31 ; 4294967296
53: mod
54: dup #(a*1259409+321625345)%4294967296
55: store 1 0 #对全局变量运算后赋值
58: return

59: store 0 1
62: const 32 ; n #局部变量n
67: const 33 ; __init__
72: define 0 0 1 2 157
81: array 0 #数组
86: self
87: const 34 ; a
92: setattr
93: const 35 ; 0#第二个局部变量 赋值为0
98: store 0 1
101: load 0 1
104: load 0 0 #加载;两个局部变量并且比较
107: lt #<
108: jz 151
113: self
114: const 34 ; a
119: getattr
120: const 36 ; append
125: getattr
126: load 1 1
129: call 0
131: call 1 # 调用第一函数
133: pop
134: load 0 1
137: const 37 ; 1
142: add
143: store 0 1 #第二个局部变量+=1
146: jmp 101
151: const 38 ; nil
156: return

157: const 33 ; __init__
162: const 39 ; x
167: const 40 ; y
172: const 41 ; r
177: define 0 0 2 2 277
186: load 0 0
189: load 0 1
192: gt #x>y
193: jz 214
198: self
199: const 41 ; r
204: getattr
205: load 0 0 #x
208: load 0 1 #y
211: tailcall 2 #回调自身
213: return

214: load 0 0
217: load 0 1
220: lt #x<y
221: jz 271
226: self
227: const 42 ; s
232: getattr
233: load 0 1
236: load 0 0
239: call 2 #调用第二个函数
241: pop
242: load 0 0
245: const 37 ; 1
250: add #x++
251: store 0 0
254: load 0 1
257: const 37 ; 1
262: sub #y--
263: store 0 1
266: jmp 214
271: const 38 ; nil
276: return

277: const 41 ; r
282: const 39 ; x
287: const 40 ; y
292: const 42 ; s
297: define 0 0 2 3 362
306: self
307: const 34 ; a
312: getattr
313: load 0 0
316: getitem
317: store 0 2
320: self
321: const 34 ; a
326: getattr
327: load 0 1
330: getitem
331: self
332: const 34 ; a
337: getattr
338: load 0 0
341: setitem
342: load 0 2
345: self
346: const 34 ; a
351: getattr
352: load 0 1
355: setitem
356: const 38 ; nil
361: return #交换

362: const 42 ; s #class
367: const 39 ; x
372: const 40 ; y
377: const 43 ; val#变量
382: const 44 ; o #函数名称
387: define 0 0 3 4 494
396: load 0 0
399: load 0 1
402: gt
403: jz 427
408: self
409: const 44 ; o
414: getattr
415: load 0 2
418: load 0 0
421: load 0 1
424: tailcall 3 #call o
426: return

427: load 0 0
430: store 0 3
433: load 0 3
436: load 0 1
439: le
440: jz 488
445: self
446: const 34 ; a
451: getattr
452: load 0 3
455: getitem
456: load 0 2
459: bxor #异或
460: self
461: const 34 ; a
466: getattr
467: load 0 3
470: setitem
471: load 0 3
474: const 37 ; 1
479: add
480: store 0 3
483: jmp 433
488: const 38 ; nil
493: return

494: const 44 ; o
499: const 45 ; A
504: class 8 0
507: store 0 2
510: const 46 ; 200000
515: store 0 7
518: load 0 2
521: load 0 7
524: call 1
526: store 0 8
529: const 35 ; 0
534: store 0 9
537: load 0 9
540: load 0 7
543: const 47 ; 5 #200000*5
548: mul
549: lt
550: jz 727
555: load 0 1
558: call 0 #w()%3
560: const 48 ; 3
565: mod
566: store 0 10
569: load 0 1
572: call 0 #w()%200000
574: load 0 7
577: mod
578: store 0 11
581: load 0 1
584: call 0 #w()%100000
586: load 0 7
589: mod
590: store 0 12
593: load 0 10
596: const 35 ; 0 #==0 call2
601: eq
602: jz 630
607: load 0 8
610: const 41 ; r
615: getattr
616: load 0 12
619: load 0 11
622: call 2
624: pop
625: jmp 710
630: load 0 10
633: const 37 ; 1 #==1 call2
638: eq
639: jz 667
644: load 0 8
647: const 42 ; s
652: getattr
653: load 0 12
656: load 0 11
659: call 2
661: pop
662: jmp 710
667: load 0 10
670: const 49 ; 2 #==2 call0
675: eq
676: jz 710
681: load 0 1
684: call 0
686: store 0 13
689: load 0 8
692: const 44 ; o
697: getattr
698: load 0 13
701: load 0 12
704: load 0 11
707: call 3 #call3
709: pop
710: load 0 9
713: const 37 ; 1
718: add #++
719: store 0 9
722: jmp 537

727: const 35 ; 0
732: store 0 14# 赋初值0
735: const 35 ; 0
740: store 0 9 #赋初值0
743: load 0 9
746: load 0 7
749: lt #<
750: jz 802
755: load 0 14
758: load 0 8
761: const 34 ; a
766: getattr
767: load 0 9
770: getitem
771: load 0 9
774: const 37 ; 1
779: add #a[i]*(i+1)
780: mul
781: add
782: store 0 14
785: load 0 9
788: const 37 ; 1
793: add#i++
794: store 0 9
797: jmp 743
802: const 23 ; <function 'print'> #输出
807: const 50 ; hitcon{
812: load 0 14
815: const 51 ; __string__
820: getattr
821: call 0
823: add
824: const 52 ; }
829: add
830: call 1
832: pop

转化完后的结果

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
var v0 = 68694329;
def w(){
v0 = (v0 * 1259409 + 321625345) % 0x100000000;
return v0;
}
class A{
def __init__(var n){
self.a = [];
var i = 0;
while (i < n){
self.a.append(w());
i += 1;
}
}
def r(var x, var y){
if (x > y){
return self.r(y, x);
}
while (x < y) {
self.s(x, y);
x += 1;
y -= 1;
}
}
def s(var x, var y){
var tmp_a = self.a[x];
self.a[x] = self.a[y];
self.a[y] = tmp_a;
}
def o(var x, var y, var val){
if (x > y){
return self.o(y, x, val);
}
var i = x;
while (i <= y){
self.a[i] = self.a[i] ^ val;
i += 1;
}
}
}

var v7 = 200000;
var v8 = A(v7);
var v9 = 0;
var v10;
var v11;
var v12;
var v13;
while (v9 < v7 * 5){
v10 = w() % 3;
v11 = w() % v7;
v12 = w() % v7;
if (v10 == 0){
v8.r(v11, v12);
}
else if (v10 == 1){
v8.s(v11, v12);
}
else if (v10 == 2){
v13 = w();
v8.o(v11, v12, v13);
}
v9 += 1;
}

var v14 = 0;
v9 = 0;
while (v9 < v7){
v14 += v8.a[v9] * (v9 + 1);
v9 += 1;
}

print ("hitcon{" + v14.__string__() + "}")

解题c脚本

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
#include<stdio.h>
#include<string.h>
unsigned int v0 = 68694329;
unsigned int v8[500001];
unsigned int w(){
v0 = (v0 * 1259409 + 321625345) ;
return v0;
}
void s(unsigned int x,unsigned int y){
unsigned int p;
p=v8[x];
v8[x]=v8[y];
v8[y]=p;
return ;
}
void r(unsigned int x,unsigned int y){
if(x>y){
r(y,x);
return ;
}
while(x<y){
s(x,y);
x++;
y--;
}
return ;
}
void o(unsigned int x,unsigned int y,unsigned int val){
if(x>y){
o(y,x,val);
return ;
}
unsigned int i=x;
while(i<=y){
v8[i]^=val;
i++;
}
return ;
}
int main(){
unsigned int v7=200000,v9=0;
unsigned int v10,v11,v12,v13;
for(int i=0;i<v7;i++){
v8[i]=w();
}

while(v9<v7*5){
v10=w()%3;
v11=w()%v7;
v12=w()%v7;
if(v10==0){
r(v11,v12);
}
else if(v10==1){
s(v11,v12);
}
else if(v10==2){
v13=w();
o(v11,v12,v13);

}
v9++;
}
v9=0;


for(int i=0;i<v7;i++){
printf("%u,\n",v8[i]);
}










return 0;
}

总结

我太菜了!