吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 983|回复: 2
收起左侧

[讨论] 关于python3和2的字节码处理

[复制链接]
红叶落尽 发表于 2020-7-21 16:20
这几天遇到一个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下有相对简单的处理方式吗?感觉我的代码经常在做类型转换 这个正常吗?

免费评分

参与人数 1热心值 +1 收起 理由
wlcf + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wlcf 发表于 2020-7-21 18:02
前来向大佬学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 15:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表