# 1. 审计代码

拿到题目后发现这是一个 pyc 文件,是一道 python 逆向题,拿到在线反编译器中反编译一下,可以得到以下代码:

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
print "Welcome to Re World!"
print "Your input1 is your flag~"
l = len(input1)
for i in range(l):
num = ((input1[i] + i) % 128 + 128) % 128
code += num
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]
print code
code = [
"\x1f",
"\x12",
"\x1d",
"(",
"0",
"4",
"\x01",
"\x06",
"\x14",
"4",
",",
"\x1b",
"U",
"?",
"o",
"6",
"*",
":",
"\x01",
"D",
";",
"%",
"\x13",
]

我们只要逐步反向写脚本就可以得到 flag,不过我在写脚本的时候想了很久,一直都没搞出来

# 2. 确定思路

首先是这一部分:

1
2
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]

这行代码的意思是将 code 从第一位开始,和后一位进行异或运算,一直到倒数第二位,那我们要还原这一步的话我们就要反过来抑或,就是这里我卡了很久,不知道怎么解决,知道看到大佬的 wp,发现可以这样:

1
2
for i in range(l-2, -1, -1):
code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))

# 3. 写出脚本

后面那步还比较好理解,把式子化简以下就可以,最后完整的脚本如下:

1
2
3
4
5
6
7
8
9
10
11
code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',',
'\x1b','U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']
flag = ''
l = len(code)
for i in range(l-2, -1, -1):
code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))

for i in range(0, len(code)):
flag += chr((ord(code[i]) - i) % 128)
print(flag)

flag:GWHT

题目来源:BUUCTF 在线评测 (buuoj.cn)–pyre