[GWCTF 2019]pyre

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

知识点串烧 🍖


 

 

0x01 将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']

 

 


 

 

0x02 解读加密过程

 

第一个

for i in range(l - 1):
    code[i] = code[i] ^ code[i + 1]
  • codel-1 位置不会修改,而且正向赋值 code[i] 不会修改 code[i+1] ,而且需要保证 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!}

 

posted @ 2021-04-13 15:40  原来是甘文川同学  阅读(718)  评论(0)    收藏  举报