当前位置: 首页 > 工具软件 > Pyre > 使用案例 >

GWCTF 2019 pyre YuSec

蔡鹏程
2023-12-01

pyre

pyc文件,直接在线反编译得到

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

简单的算法逆向
看到后面的异或是对code的第i位和第i+1位进行异或,可以得到,最后一位是没有异或过的,通过最后一位再异或回去就可以了

code = [0x1f,0x12,0x1d, 0x28,0x30,0x34, 0x01,0x06,0x14, 0x34,
        0x2c, 0x1b, 0x55,0x3f,0x6f,0x36,0x2a,0x3a, 0x01, 0x44,
        0x3b,0x25, 0x13]
print(code)

code.reverse()
l = len(code)

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

第二步:

for i in range(l):
    num = ((input1[i] + i) % 128 + 128) % 128
    code += num

这里源码中取了两次余,实际上第二次是多余,所以只看第一次
这里可以发现,标准ASCII的最大值是127,如果这个数放在后面是有可能超过128的,所以需要做一个判断就是
if code[i] - i < 0,如果小于0说明取余前的数肯定是大于128,所以这里需要再加128就可以了,code[i] = code[i] - i + 128
这里举个例子理解一下,

假设未加密的code[20] = 115
那么进行加密过程就是:
115 + 20 = 135 % 128 = 7
解密的时候就会发现
7 - 20 = 13
这里13刚好就是115到128的距离
所以可以得出明文为
-13 + 128 = 115

最后放上exp.py

print('Welcome to Re World!')
print('Your input1 is your flag~')

code = [0x1f,0x12,0x1d, 0x28,0x30,0x34, 0x01,0x06,0x14, 0x34,
        0x2c, 0x1b, 0x55,0x3f,0x6f,0x36,0x2a,0x3a, 0x01, 0x44,
        0x3b,0x25, 0x13]

code.reverse()
l = len(code)

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

code.reverse()

for i in range(len(code)):
    if code[i] - i < 0:
        code[i] = code[i] + 128 -i
    else:
        code[i] -= i

flag = ''.join(chr(i) for i in code)
print(flag)

# GWHT{Just_Re_1s_Ha66y!}
 类似资料:

相关阅读

相关文章

相关问答