buuctf re [羊城杯 2020]Bytecode

下载附件

得到一个文本文档,存放的是python字节码。

Python 代码先被编译为字节码后,再由Python虚拟机来执行字节码, Python的字节码是一种类似汇编指令的中间语言, 一个Python语句会对应若干字节码指令,虚拟机一条一条执行字节码指令, 从而完成程序执行。Python dis 模块支持对Python代码进行反汇编, 生成字节码指令。

反编译py字节码,还原py源码

在这里推荐一篇看雪好文

仔细阅读文章后,来进行手工还原python源码。

得到如下源码。

反编译的py脚本

en = [3,37,72,9,6,132]
output = [101,96,23,68,112,42,107,62,96,53,176,179,98,53,67,29,41,120,60,106,51,101,178,189,101,48]

print('welcome to GWHT2020')

flag = input('please input your flag:')
str = flag

a = len(str)
if a < 38:
    print('lenth wrong!')
    exit(0)

if ord(str[0]) + 2020*ord(str[1]) + 2020*ord(str[3]) + 2020*ord(str[4]) == 1182843538814603:
    print('good!continue\xe2\x80\xa6\xe2\x80\xa6')
else:
    print('bye~')
    exit(0)

x = []
k = 5
for i in range(13):
    b = ord(str[k])
    c = ord(str[k + 1]) 
    a11 = c ^ en[i%6]   # c==a11^en[i%6]
    a22 = b ^ en[i%6]   # b==a22^en[i%6]
    x.append(a11)
    x.append(a22)
    k += 2
if x == output:
    print('good!continue\xe2\x80\xa6\xe2\x80\xa6') 
else:
    print('oh,you are wrong!')
    exit(0)

l = len(str)
a1 = ord(str[l - 7]) 
a2 = ord(str[l - 6])
a3 = ord(str[l - 5])
a4 = ord(str[l - 4])
a5 = ord(str[l - 3])
a6 = ord(str[l - 2])
if a1*3 + a2*2 +a3*5 == 1003:
    if a1*4 + a2*7 + a3*9 == 2013:
        if a1 + a2*8 +a3*2 ==1109:
            if a1*3 + a5*2 + a6*5 == 671:
                if a4*4 + a5*7 + a6*9 == 1252:
                    if a4 + a5*8 +a6*2 == 644:
                        print('congraduation!you get the right flag!')

 分析写脚本

不用管头部,只用分析flag{}里面的内容。其实写出的脚本逻辑很清晰,包含z3解方程。

直接上脚本吧,不多说了。

#EXP

from z3 import *

en = [3,37,72,9,6,132]
output = [101,96,23,68,112,42,107,62,96,53,176,179,98,53,67,29,41,120,60,106,51,101,178,189,101,48]
flag = ''
k = 0
x=[]

for i in range(13):
    c = chr(output[k] ^ en[i%6])
    b = chr(output[k+1] ^ en[i%6])
    x.append(b)
    x.append(c)
    k += 2

flag = ''.join(x)
#print(flag)

a1=Int('a1')
a2=Int('a2')
a3=Int('a3')
a4=Int('a4')
a5=Int('a5')
a6=Int('a6')
s=Solver()
s.add(a1*3+a2*2+a3*5==1003)
s.add(a1*4+a2*7+a3*9==2013)
s.add(a1+a2*8+a3*2==1109)
s.add(a4*3+a5*2+a6*5==671)
s.add(a4*4+a5*7+a6*9==1252)
s.add(a4+a5*8+a6*2==644)

if s.check()==sat:
	result=s.model()
print(result)

s = [97,101,102,102,55,51]
for i in range(6):
    flag +=chr(s[i])
print(flag)

运行结果:

flag{cfa2b87b3f746a8f0ac5c5963faeff73}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值