>
>
萌新赛-逆向签退
yuchoxuuan
打开题目是个pyc,
uncompyle6 x.pyc > x.py
import string
c_charset = string.ascii_uppercase + string.ascii_lowercase + string.digits + '()'
flag = 'BozjB3vlZ3ThBn9bZ2jhOH93ZaH9'
def encode(origin_bytes):
c_bytes = [ ('{:0>8}').format(str(bin(b)).replace('0b', '')) for b in origin_bytes ]
resp = ''
nums = len(c_bytes) // 3
remain = len(c_bytes) % 3
integral_part = c_bytes[0:3 * nums]
while integral_part:
tmp_unit = ('').join(integral_part[0:3])
tmp_unit = [ int(tmp_unit[x:x + 6], 2) for x in [0, 6, 12, 18] ]
resp += ('').join([ c_charset[i] for i in tmp_unit ])
integral_part = integral_part[3:]
if remain:
remain_part = ('').join(c_bytes[3 * nums:]) + (3 - remain) * '0' * 8
tmp_unit = [ int(remain_part[x:x + 6], 2) for x in [0, 6, 12, 18] ][:remain + 1]
resp += ('').join([ c_charset[i] for i in tmp_unit ]) + (3 - remain) * '.'
return rend(resp)
def rend(s):
def encodeCh(ch):
f = lambda x: chr((ord(ch) - x + 2) % 26 + x)
if ch.islower():
return f(97)
if ch.isupper():
return f(65)
return ch
return ('').join(encodeCh(c) for c in s)
可以看到他的加密分为两个部分,第一部分是把每三位取出来,转二进制,然后得到
1- 头尾相连拼起来 3*8=24位二进制数,
2- 24位二进制数分成四段,得到四个6位二进制数
3- 用这四个6位二进制数去查他的字母表,然后用字母表示出来
说的很啰嗦其实跟base编码路子一样的
接下来,这个类base码经过encode二次加密。encode看起来麻烦但是其实有个好处就是踏实线性的,也就是说明文密文一一对应的,所以我就懒得分析了,直接穷举。
在它的代码下面添加如下部分执行就ok了 我知道我代码很烂,表笑话我
ured=''
for i in flag:
for j in c_charset:
if rend(j) == i :ured+=j; break
print(ured)
for i in range(len(ured) // 4):
u = ured[4 * i:4 * i + 4]
stmp = ''
for s in u:
bc = bin(c_charset.index(s))[2:]
bc = '0' * (6 - len(bc)) + bc
stmp += bc
al = CharF.str2num(stmp,bs=2,spl=8)
for xx in al:
print(chr(xx),end='')
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论