下载附件
得到一个文本文档,存放的是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}
|