[GWCTF 2019]pyre
文件链接:https://pan.baidu.com/s/1J5GGnntQkN8IWD0hKs-X8g
提取码:hvn1
-
-
.pyc文件: python代码转换为字节码后的文件
-
-
-

#!/usr/bin/env python # visit http://tool.lu/pyc/ for more information print 'Welcome to Re World!' print 'Your input1 is your flag~' l = len(input1) //l获得输入的长度 for i in range(l): //对每个输入进行遍历 num = ((input1[i] + i) % 128 + 128) % 128 // 有关取模,由于(a%c+b%c)%c=(a+b)%c,所以num 等价于 (input1[i] + i) % 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']
第一个
for i in range(l - 1): code[i] = code[i] ^ code[i + 1]
-
- 最简单的逆向异或式子
A ^ A =0 A ^ 0 =A 所以: A ^ A ^ B = B
-
不难得到,
code[i] = code[i] ^ code (i+1)的正向运行结果 -
逆向的
code[i] = code[i] ^ code (i+1)等于code[i] = code[i] ^ code (i+1) ^ code (i+1) -
也就是
code[i] = code[i] ^ code (i+1)。所以我们只要要倒序枚举,使用code[i] = code[i] ^ code (i+1)算出每一个code[i]原来的值
第二个
for i in range(l): num = ((input1[i] + i) % 128 + 128) % 128 code += num
emm去模,由于(a%c+b%c)%c=(a+b)%c,所以num 等价于 (input1[i] + i) % 128
0x04 构造逆向反加密脚本
code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13'] flag = '' for i in range(len(code)-2, -1, -1): code[i]=chr(ord(code[i])^ord(code[i+1])) for i in range(len(code)): flag+=chr((ord(code[i])-i)%128) print(flag)

GWHT{Just_Re_1s_Ha66y!}
未亡人

浙公网安备 33010602011771号