IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> buuctf re [羊城杯 2020]Bytecode -> 正文阅读

[Python知识库]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}

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:44:46  更:2022-03-13 21:45:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:28:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码