0%

GWCTF 2019 pyre

文件链接:https://pan.baidu.com/s/1J5GGnntQkN8IWD0hKs-X8g
提取码:hvn1

知识点串烧 🍖


0x01 将pyc文件解密成python文件

0

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
35
36
37
#!/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']

0x02 解读加密过程

第一个

1
2
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]
  • codel-1 位置不会修改,而且正向赋值 code[i] 不会修改 code[i+1] ,而且需要保证 code[i+1] 一直是原始值

  • 最简单的逆向异或式子

1
2
3
4
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] 原来的值

第二个

1
2
3
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 构造逆向反加密脚本

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 = ''

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)

1

1
GWHT{Just_Re_1s_Ha66y!}

欢迎关注我的其它发布渠道