字节码
题目

解法
总的来讲虽然题目简单还是有点收获的
出来是一个字节码txt
6 STORE_FAST 1 (s)
5 8 BUILD_LIST 0
10 LOAD_CONST 2 ((177, 171, 170, 185, 167, 180, 126, 136, 126, 147, 150, 146, 122, 126, 142, 129, 139, 137, 142, 117, 122, 130, 195, 132, 116, 109, 104))
12 LIST_EXTEND 1
14 STORE_FAST 2 (tmp)
6 16 LOAD_GLOBAL 0 (range)
18 LOAD_GLOBAL 1 (len)
20 LOAD_FAST 0 (flag)
22 CALL_FUNCTION 1
24 CALL_FUNCTION 1
26 GET_ITER
>> 28 FOR_ITER 30 (to 60)
30 STORE_FAST 3 (i)
7 32 LOAD_FAST 1 (s)
34 LOAD_METHOD 2 (append)
36 LOAD_CONST 3 (255)
38 LOAD_GLOBAL 3 (ord)
40 LOAD_FAST 0 (flag)
42 LOAD_FAST 3 (i)
44 BINARY_SUBSCR
46 CALL_FUNCTION 1
48 LOAD_FAST 3 (i)
50 BINARY_ADD
52 BINARY_XOR
54 CALL_METHOD 1
56 POP_TOP
58 JUMP_ABSOLUTE 28
8 >> 60 LOAD_FAST 2 (tmp)
62 LOAD_FAST 1 (s)
64 COMPARE_OP 2 (==)
66 POP_JUMP_IF_FALSE 78
9 68 LOAD_GLOBAL 4 (print)
70 LOAD_CONST 4 ('you are right')
72 CALL_FUNCTION 1
74 POP_TOP
76 JUMP_FORWARD 8 (to 86)
11 >> 78 LOAD_GLOBAL 4 (print)
80 LOAD_CONST 5 ('this is wrang')
82 CALL_FUNCTION 1
84 POP_TOP
>> 86 LOAD_CONST 0 (None)
88 RETURN_VALUE
又去详细看了一下字节码的手撕流程
拿这段代码的核心代码举例
32 LOAD_FAST 1 (s)
34 LOAD_METHOD 2 (append)
36 LOAD_CONST 3 (255)
38 LOAD_GLOBAL 3 (ord)
40 LOAD_FAST 0 (flag)
42 LOAD_FAST 3 (i)
44 BINARY_SUBSCR
46 CALL_FUNCTION 1
48 LOAD_FAST 3 (i)
50 BINARY_ADD
52 BINARY_XOR
54 CALL_METHOD 1
56 POP_TOP
58 JUMP_ABSOLUTE 28
其实就是栈内元素操作的关系
- 压入s 我们输入的东西
- 压入append方法
- 压入255
- 压入ord函数
- 压入flag
- 压入i变量
- 然后第一个操作BINARY_SUBSCR 取下标,此时flag和i变成一个栈顶元素flag[i]
- 然后调用函数CALL_FUNCTION 1其实就是ord这个函数。此时栈顶为ord(flag[i])
- 压入变量i
- BINARY_ADD将栈顶ord(flag[i])和i相加(ord(flag[i])+i)
- BINARY_XOR将栈顶(ord(flag[i])+i)异或255
- 然后调用方法 append进去
写成python就是(ord(flag[i])+i)^255
其实只要慢慢解就可以了,但是掉进去一个坑
写成这样了
问题就是次序问题 会先255 +i 然后和与tmp[i]异或(其实是加号,图片错了)

只要加上括号

或者分开写

就ok
test your cmd
题目

解法
打开程序果然立马消失了。
ida打开
如图下断点

因为在结束前下的断点,所以输出内容停住了
