[春秋杯] easy_python
考点一览
python字节码
字节码
指令符号的含义
LOAD_CONST:加载常量,比如数值、字符串。用于传递给函数作为参数
BUILD_LIST:用于创建一个list结构
LOAD_FAST:用于读取值,用于计算或者函数调用传参等。
STORE_FAST:用于保存值到局部变量。
SETUP_LOOP:用于开始一个循环
BINARY_RSHIFT:用于右移(>>)
BINARY_LSHIFT:用于左移(<<)
BINARY_OR:用于位或(|)
BINARY_AND:用于位与(&)
##认真解题
下载文件后,是一个这样的文本文件:
3 0 LOAD_CONST 1 (204)
3 LOAD_CONST 2 (141)
6 LOAD_CONST 3 (44)
9 LOAD_CONST 4 (236)
12 LOAD_CONST 5 (111)
15 LOAD_CONST 6 (140)
18 LOAD_CONST 6 (140)
21 LOAD_CONST 7 (76)
24 LOAD_CONST 3 (44)
27 LOAD_CONST 8 (172)
30 LOAD_CONST 9 (7)
33 LOAD_CONST 9 (7)
36 LOAD_CONST 10 (39)
39 LOAD_CONST 11 (165)
42 LOAD_CONST 12 (70)
45 LOAD_CONST 9 (7)
48 LOAD_CONST 10 (39)
51 LOAD_CONST 13 (166)
54 LOAD_CONST 11 (165)
57 LOAD_CONST 14 (134)
60 LOAD_CONST 14 (134)
63 LOAD_CONST 6 (140)
66 LOAD_CONST 1 (204)
69 LOAD_CONST 11 (165)
72 LOAD_CONST 9 (7)
75 LOAD_CONST 10 (39)
78 LOAD_CONST 15 (230)
81 LOAD_CONST 6 (140)
84 LOAD_CONST 11 (165)
87 LOAD_CONST 12 (70)
90 LOAD_CONST 3 (44)
93 LOAD_CONST 8 (172)
96 LOAD_CONST 16 (102)
99 LOAD_CONST 17 (6)
102 LOAD_CONST 6 (140)
105 LOAD_CONST 1 (204)
108 LOAD_CONST 15 (230)
111 LOAD_CONST 15 (230)
114 LOAD_CONST 7 (76)
117 LOAD_CONST 18 (198)
120 LOAD_CONST 19 (38)
123 LOAD_CONST 20 (175)
126 BUILD_LIST 42
129 STORE_FAST 0 (flag)
4 132 SETUP_LOOP 54 (to 189)
135 LOAD_GLOBAL 0 (range)
138 LOAD_CONST 21 (42)
141 CALL_FUNCTION 1
144 GET_ITER
>> 145 FOR_ITER 40 (to 188)
148 STORE_FAST 1 (i)
5 151 LOAD_FAST 0 (flag)
154 LOAD_FAST 1 (i)
157 BINARY_SUBSCR
158 LOAD_CONST 22 (5)
161 BINARY_RSHIFT
162 LOAD_FAST 0 (flag)
165 LOAD_FAST 1 (i)
168 BINARY_SUBSCR
169 LOAD_CONST 23 (3)
172 BINARY_LSHIFT
173 BINARY_OR
174 LOAD_CONST 24 (255)
177 BINARY_AND
178 LOAD_FAST 0 (flag)
181 LOAD_FAST 1 (i)
184 STORE_SUBSCR
185 JUMP_ABSOLUTE 145
>> 188 POP_BLOCK
>> 189 LOAD_CONST 0 (None)
192 RETURN_VALUE
其中这一块是给flag数组初始化:
对应python代码的第三行:
flag={204,141,44,236,111,140,140,76,44,172,7,7,39,165,70,7,39,166,165,134,134,140,204,165,7,39,230,140,165,70,44,172,102,6,140,204,230,230,76,198,38,175}
这里一共42个数字,flag为数组名。
这一块是进行循环:
对应python代码的第四行:
for i in range(42):
最后一块是是进行加密并输出:
print(chr((flag[i] >> 5) | (flag[i] << 3) & 255),end='')
加密:先让元素A右移5次成为元素B,再让元素A左移3次成为元素C,再让B与C进行位或运算成为元素D最后元素D和255位与~
综上python代码为:
//不知道是啥
//也不知道是啥
flag = [204, 141, 44, 236, 111, 140, 140, 76, 44, 172, 7, 7, 39, 165, 70, 7, 39, 166, 165, 134, 134, 140, 204, 165, 7, 39, 230, 140, 165, 70, 44, 172, 102, 6, 140, 204, 230, 230, 76, 198, 38, 175]
for i in range(42):
print(chr((flag[i] >> 5) | (flag[i] << 3) & 255),end='')
答案为:flag{ddbae889-2895-44df-897d-2ae30df77b61}
##问答环节
Q1:怎么看出要右移,左移的呢?
A1:这时你应该知道BINARY开头的指令符号都是运算符,要注意哦!
##预告一下
我看看我什么时候写二叉树哈~