GWCTF 2019 pyre YuSec

20 篇文章 0 订阅

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!}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值