# 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