这几天遇到一个CTF题,里面有个加密脚本,作用就是读取一个文件,把一个byte分成2半,各组成一个新文件,代码如下:
[Python] 纯文本查看 复制代码 # -*- coding:utf8 -*-
from base64 import *
s=open('flag.jpg','rb').read()
s='-'.join(map(b16encode,list(s)))
s=map(''.join,zip(*(s.split('-'))))
with open('first','wb') as f:
f.write(b16decode(s[0]))
with open('second','wb') as f:
f.write(b16decode(s[1]))
还原的思路也不难,就是把生成的2个文件byte码给掰开,按照顺序重新组合。以下是解题大佬的代码 python2.7的
[Python] 纯文本查看 复制代码 # -*- coding: cp936 -*-
from base64 import *
s1=open('first','rb').read()
s2=open('second','rb').read()
s1=''.join(map(b16encode,list(s1)))
s2=''.join(map(b16encode,list(s2)))
str=""
for i in range(0,len(s1)):
str+=s1[i]+s2[i];
str=str.decode('hex')
with open(r'flag.jpg','wb') as f:
f.write(str)
然后我就在python3里面来操作,遇到各种坑,主要就是各种类型转换的坑(特别是list函数),终于找到一条途径,代码如下:
[Python] 纯文本查看 复制代码 # -*- coding: utf8 -*-
from base64 import *
import codecs
s1=open('first','rb').read()
s2=open('second','rb').read()
def dobyte(x):
return x.to_bytes(1,'little')
s11=list(map(dobyte,list(s1))) #list方法后会自动转为int,需要转回byte
s21=list(map(dobyte,list(s2)))
s12=list(map(b16encode,s11)) #进行base16编码
s22=list(map(b16encode,s21))
def dostr(x):
return x.decode()
s13=''.join(list(map(dostr,s12))) #转为str方便分割
s23=''.join(list(map(dostr,s22)))
str=""
for i in range(0,len(s1)):
str+=s13[i]+s23[i] #把分割的字符组合
tt=bytes.fromhex(str) #转码为byte
with open(r'flag.jpg','wb') as f:
f.write(tt)
我想问问各位大佬,python3下有相对简单的处理方式吗?感觉我的代码经常在做类型转换 这个正常吗? |