首页 > 其他分享 >[羊城杯 2020]ByteCode writeup

[羊城杯 2020]ByteCode writeup

时间:2023-02-24 17:46:24浏览次数:57  
标签:writeup a3 a1 flag a2 2020 ByteCode ord a4

下载附件打开:

 

 可以判断为是Python 字节码,按照逻辑手动反编译出源码来即可,逻辑并不复杂,有不懂的地方可以看参考文献

还原出来的源码为:

# flag = input("please input your flag: ")
flag = ""
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]

a = len(flag)
if a < 38:
    print("length wrong")
    exit(0)
if 2020 * (ord(flag[0]) + ord(flag[1]) + ord(flag[2]) + ord(flag[3]) + ord(flag[4])) == 1182843538814603:
    print('good!continue\xe2\x80\xa6\xe2\x80\xa6')
else:
    print("byte~")
    exit(0)

x = []
k = 5
for i in range(13):
    b = ord(flag[k])
    c = ord(flag[k + 1])
    a11 = c ^ en[i % 6]
    a22 = b ^ 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(flag)
a1 = ord(flag[l - 7])
a2 = ord(flag[l - 6])
a3 = ord(flag[l - 5])
a4 = ord(flag[l - 4])
a5 = ord(flag[l - 3])
a6 = ord(flag[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 a4 * 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!')

可以看到最后的判断条件是一个6元一次方程,可以用z3求解:

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import z3


# In[2]:


solver = z3.Solver()


# In[4]:


a1,a2,a3,a4,a5,a6 = z3.Ints('a1 a2 a3 a4 a5 a6')


# In[5]:


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


# In[8]:


if solver.check() == z3.sat:
    ans = solver.model()
    print(ans)


# In[9]:


type(ans)


# In[14]:


flag = [0] * 38


# In[15]:


l = len(flag)


# In[16]:


l


# In[17]:


flag[l - 7] = a1
flag[l - 6] = a2
flag[l - 5] = a3
flag[l - 4] = a4
flag[l - 3] = a5
flag[l - 2] = a6


# In[18]:


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]


# In[19]:


len(output)


# In[20]:


a11 = []
a22 = []
for i in range(0, len(output), 2):
    a11.append(output[i])
    a22.append(output[i+1])


# In[21]:


en = [3, 37, 72, 9, 6, 132]


# In[23]:


k = 5
for i in range(13):
    flag[k] = a22[i] ^ en[i % 6]
    flag[k+1] = a11[i] ^ en[i % 6]
    k += 2


# In[24]:


flag


# In[33]:


flag[l - 7] = ans[a1].as_long()
flag[l - 6] = ans[a2].as_long()
flag[l - 5] = ans[a3].as_long()
flag[l - 4] = ans[a4].as_long()
flag[l - 3] = ans[a5].as_long()
flag[l - 2] = ans[a6].as_long()


# In[34]:


flag


# In[35]:


"".join(chr(int(x)) for x in flag)

 最后可以拿到flag:

中间字符串就是flag内容,前5个字符和最后一个字符是flag的格式

需要注意的是,z3求解出来的答案类型为z3.z3.IntNumRef,这个参数不能直接当作参数,也不能用int()转换,需要在求解的时候加上.as_long()转化

 

标签:writeup,a3,a1,flag,a2,2020,ByteCode,ord,a4
From: https://www.cnblogs.com/BlackIce416/p/17152326.html

相关文章

  • Matlab 2020a 中文破解版软件包下载及图文安装教程​
    MATLAB是美国MathWorks公司出品的商业数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语......
  • Matlab 2020b 中文破解版软件包下载及图文安装教程​
    MATLAB是美国MathWorks公司出品的商业数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语......
  • CTT 2020 部分记录
    想了想还是分开写(感觉自己落了很多题啊,退役前都补不完了day1T1:感觉像是k线性基板子,但我又不怎么会day3T1:看到神秘的条件感觉不太好dp,但可以算\(\sum(-1)^{val......
  • Tekla Structures 2020 中文破解版软件安装包下载及安装图文教程​ ​
    TeklaStructures是一款钢结构详图设计软件,功能包括3D实体结构模型与结构分析完全整合、3D钢结构细部设计、3D钢筋混凝土设计、专案管理、自动ShopDrawing、BOM表自动......
  • Autodesk Powermill Ultimate 2020中文破解版安装包下载及图文安装教程​
    powermill系列软件,是目前互联网上最优秀的用于高速三轴、五轴及多轴加工的专业数控编程CAM软件,拥有多轴数控加工、多轴机床的五轴编程、专业控制和优化、机床仿真和验证等功......
  • Solid Edge 2020 安装包下载及图文安装教程​
    SolidEdge是最完整的混合2D/3DCAD系统,采用同步技术加速设计和编辑过程,增强了对重用导入几何的支持。SolidEdge是Velocity系列解决方案组合的关键组成部分。它是一个优秀的工......
  • [Cnoi2020]光图-解题思路
    P6159-Cnoi2020光图\(通过观察样例,我们会发现光线先是从0号点射向p号点,然后再射到p\times2号点,然后是p\times3号点,以此类推。那么射到的第k个点应该就是编号为p\tim......
  • J. Abstract Painting (2020 CCPC 长春)
    J.AbstractPaintingtag:dp题目链接题意:有个很抽象的人要画一幅抽象画,这个抽象画只需要画圆圈就完事了(我上我也行)需要满足以下条件圆心都必须在x轴上的[1,n]上,且必......
  • Java开发工具IntelliJ IDEA 2020.2完整授权流程
    最近几年,Java的技术栈发展的非常快,Java作为一门十分流行的面向对象编程语言,其开发工具也是非常多的,当然因为接触时间长短以及个人喜好,每个人都有自己的选择。对此,我对目前......
  • 2020-11-10
    ​CSS中的BFC详解​一、何为BFC     BFC(BlockFormattingContext)格式化上下文,是Web页面中盒模型布局的CSS渲染模式,指一个独立的渲染区域或者说是一个隔离的独立容器......