攻防世界 —— Crypto新手练习区9题(easychallenge)题解

题目分析

附件是一个.pyc文件,.pyc文件是.py文件编译后生成的文件,所以我们第一步要进行反编译。使用python的反编译库uncompyle反编译后得到原始的.py文件如下:

解题过程

通过分析关键代码,最后的if判断语句,我们知道,flag依次经过encode1, encode2, encode3三层加密后得到了final字符串。那么要想得到flag我们需要针对三个加密函数写出相应的解密函数,即decode1, decode2, decode3,然后按照decode3, decode2, decode1的顺序对final解密,就可以得到flag了。

在3个加密函数中,有一些python的内置函数,先解释说明一下(也可以参见python 3.7.7文档):

  • base64.b32encode(ans),用 Base32 编码字节类对象(bytes-like object)ans,并返回编码过的字节(bytes)。
  • chr(x),返回Unicode码位为整数x的字符的字符串格式。例如,chr(97)返回字符串'a',chr(8364) 返回字符串 '€'
  • ord(i),对表示单个Unicode字符的字符串i,返回代表它 Unicode 码位的整数。例如ord('a')返回整数97,ord( '€') 返回8364。这是chr()的逆函数。

还有一个运算符:

  • ^,按位异或运算符,当两个对应的二进制位相异时,结果为1,这里有一个重要的定律需要知道,那就是A异或B的结果再异或B,就可以得到A。

使用python编写三个解密函数,我的代码如下:

import base64
def decode3(ans):
    return base64.b32decode(ans)

在写decode2()的时候我遇到了一个大坑,至今都没想明白,在encode2()中最后一步是chr(),按道理来说在decode2()中第一步应该先是ord(),可是我按照自己的思路写发现不对了,最后看别人的题解,发现他们都没有ord()这一步,这就让我很费解,希望可以得到大佬赐教(●'◡'●)。

def decode2(ans):
    s = ''
    for i in ans:
        i = i ^ 36
        x = i - 36
        s += chr(x)
    return s
def decode1(ans):
    s = ''
    for i in ans:
        i = ord(i) - 25
        x = i ^ 36
        s += chr(x)
    return s
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
print(decode1(decode2(decode3(final))))

然后我们就得到flag了。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值