首页 > 其他分享 >2024 ByteCTF

2024 ByteCTF

时间:2024-09-23 16:23:05浏览次数:7  
标签:plt end lines 2024 split print line ByteCTF

ByteCTF

极限逃脱

题目描述:本题需要通过动态调试分析出要输入的内容,可能在某些地方会有提示出现。

这是一个IOS逆向,因为没有设备只能静态分析

流程和安卓逆向大概一致 解压拖进ida

提示输入flag格式 根据"-"进行切割

image-20240922093743354

其实就是uuid格式,正确输入后有一个赋值操作

image-20240922093821488

然后往下看注意到

{%@-%@-%@-%@-%@} part5,part2,part3,part4,part5

计算这个字符串的sha256

image-20240922093913056

后面是根据每一部分的长度进行切片操作,然后是一个替换

注意每个部分的起始位置

最后进行比较

48d43cd4a6479fe599dee4ea8ea8b21d

最后切片进行替换

a="6c9838a3c6810bdb2633ed5910b8547c09a7a4c08bf69ae3a95c5c37f9e8f57e"
#print 1 to 9
for i in range(1,9):
    print(a[i],end='')
print("-",end='')
for i in range(9,13):
    print(a[i],end='')
print("-",end='')    
for i in range(5,9):
    print(a[i],end='')
print("-",end='')
for i in range(5,9):
    print(a[i],end='')
print("-",end='')
for i in range(5,17):
    print(a[i],end='')


# c9838a3c-6810-8a3c-8a3c-8a3c6810bdb2

ByteBuffer

FlatBuffers 的序列化格式

FlatBuffers 就是把对象数据,保存在一个一维的数组中,将数据都缓存在一个 ByteBuffer 中,每个对象在数组中被分为两部分。

元数据部分:负责存放索引。真实数据部分:存放实际的值

使用 4 字节的 UInt 来存储 10 位数字的整数。

FlatBuffers 对序列化基本使用原则:

  • 小端模式。FlatBuffers 对各种基本数据的存储都是按照小端模式来进行的,因为这种模式目前和大部分处理器的存储模式是一致的,可以加快数据读写的数据。
  • 写入数据方向和读取数据方向不同

从给的二进制文件看

一部分给的是dot数据

image-20240922153822793

另一部分给的是Edge数据

image-20240922153843192

对应着点和边,我们需要恢复原来的数据

dot数据 每4位为一组

image-20240922154056092

这里采用小端序排序

x1=06 40=1600 y1=4B=75 依次每四位可以拿到所有的点的数据

同理 在边上

image-20240922154930836

Edge #103对应着 0x77 0x75 即点119 117

根据原理可以写出梭哈脚本

cnt = 0

with open("ByteBuffer.bin", "rb") as file:
    ans = file.read()

# print(ans)
import struct

edge_index = 0x3AC
dot_index = 0x1230

while edge_index < 0x120C:
    tmp = struct.unpack("<Q", ans[edge_index : edge_index + 8])[0]
    edge_index += 8
    dot1 = struct.unpack("<L", ans[edge_index : edge_index + 4])[0]
    edge_index += 4
    dot2 = struct.unpack("<L", ans[edge_index : edge_index + 4])[0]
    edge_index += 4
    edge_index += 4
    length = ((struct.unpack("<L", ans[edge_index : edge_index + 4])[0] + 4) // 4) * 4
    # print(length)
    edge_index += 4
    name = ans[edge_index : edge_index + length].decode()

    print("line_name:" + name)
    print("linked_dot1:" + str(dot1))
    print("linked_dot2:" + str(dot2))
    edge_index += length

print("line_name:" + "Edge #0")
print("linked_dot1:" + str(2))
print("linked_dot2:" + str(1))

while dot_index < 0x1F88:
    tmp = struct.unpack("<L", ans[dot_index : dot_index + 4])[0]
    dot_index += 4
    x1 = struct.unpack("<L", ans[dot_index : dot_index + 4])[0]
    dot_index += 4
    y1 = struct.unpack("<L", ans[dot_index : dot_index + 4])[0]
    dot_index += 4
    dot_index += 4
    length = ((struct.unpack("<L", ans[dot_index : dot_index + 4])[0] + 4) // 4) * 4
    # print(length)
    dot_index += 4
    name = ans[dot_index : dot_index + length].decode()

    print("dot_name:" + name)
    print("x:" + str(x1))
    print("y:" + str(y1))
    dot_index += length

print("dot_name:" + "Dot #2")
print("x:" + str(0x19))
print("y:" + str(0x4B))

得到

image-20240922155041251

然后根据点和线的关系进行绘图

import matplotlib.pyplot as plt

# 读取数据
dots = {}
edges = []

with open("1(1).txt", "r") as f:
    lines = f.readlines()

for i in range(0, len(lines), 3):
    line = lines[i].strip()
    if line.startswith("dot_name"):
        dot_name = line.split(":")[1].split("#")[1]
        line2 = lines[i + 1].strip()
        line3 = lines[i + 2].strip()
        x = int(line2.split(":")[1])
        y = int(line3.split(":")[1])
        dots[dot_name] = (y, x)
    elif line.startswith("line_name"):
        line_name = line.split(":")[1]
        line2 = lines[i + 1].strip()
        line3 = lines[i + 2].strip()
        dot1 = line2.split(":")[1]
        dot2 = line3.split(":")[1]
        edges.append((dot1, dot2))

# 绘制点
for dot_name, (x, y) in dots.items():
    plt.plot(x, y)

# 绘制线段
for dot1, dot2 in edges:
    x1, y1 = dots[dot1]
    x2, y2 = dots[dot2]
    plt.plot([x1, x2], [y1, y2], "b-")

# 设置标签
plt.xlabel("X")
plt.ylabel("Y")
plt.legend()
plt.show()

image-20240922155303954

得到flag

标签:plt,end,lines,2024,split,print,line,ByteCTF
From: https://www.cnblogs.com/BediveRe/p/18424908

相关文章

  • 2024ICPC网络赛2
    赛时5题,G题思路对的不知道为啥没过,对辗转相除法还有递推理解太低是这样的。F,I队友切的签到,I似乎是简单构造A模拟这题离谱的一个地方就是我用unordered_map会报错所以改map了。查了一下语法发现是因为没有自定义哈希函数,所以key值不是常规类型的时候必须自定义哈希函数。(当然......
  • 2024十大网站设计公司TOP10,快来看看这十家网站设计公司吧
    可以参考以下以下几家网站设计公司,我这段时间也了解了很多的网站建设步骤和冷知识,对一些网站设计公司的质量和专业水准也算有一点个人见解:1.极简慕枫PithyMfweb这家公司从业多年,有着丰厚的行业经验和专业知识,一直都致力于为每一位客户提供既独特又符合其品牌形象的网站设计。......
  • 2024最新版Java面试题及答案汇总
    1.对字符串的都有哪些方法?详细说明下。具体有String、StringBuffer和StringBuilder这三个类。String是不可变类,每次操作都会生成新的String对象,并将结果指针指向新的对象,由此会产生内存碎片。如果要频繁对字符串修改,建议采用StringBuffer和StringBuilder。StringBuff......
  • 2024三掌柜赠书活动第三十期:秒懂AI小红书:7招玩转素人博主变现
    目录前言打工人下班搞自媒体副业?7招玩转素人博主变现1. 智能选题,紧跟潮流2. 个性化内容创作3. 精准投放,高效引流4. 合作推广,双赢变现5. 直播带货,互动变现6. 社群运营,增强粘性7. 持续学习,紧跟AI步伐关于《秒懂AI小红书:7招玩转素人博主变现》编辑推荐内容简......
  • 2024Java核心面试题合集
    1.保证并发安全的三大特性? 原子性:一次或多次操作在执行期间不被其他线程影响可见性:当一个线程在工作内存修改了变量,其他线程能立刻知道有序性:JVM对指令的优化会让指令执行顺序改变,有序性是禁止指令重排2.volatile保证变量的可见性和有序性,不保证原子性。使用了volatile......
  • 2024年全新Java面试题整理
    1、多线程的价值?(1)发挥多核CPU的优势多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的,采用多线程的方式去同时完成几件事情而不互相干扰。(2)防止阻塞从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线......
  • Fall 2024 IE 360 Facilities Planning and Design
    Fall2024IE360FacilitiesPlanningandDesign  Homework1Name: Clickortapheretoentertext.        StudentID:Clickortapheretoentertext. Question1:(60pts)Anautomobileenginecylindermanufacturingcompanyplanstoman......
  • 【亲测可用】Adobe After Effects(AE2024)软件下载安装(附软件安装包)
    目录简介下载链接安装步骤操作指南界面介绍:基本操作:高级技巧:简介AdobeAfterEffects,简称AE,是Adobe公司推出的一款专业的视觉效果和动态图形处理软件。它广泛应用于电影、电视、广告、网络视频和社交媒体等领域,为创作者提供了强大的工具和功能,以创建引人注目的视觉......
  • 【win/mac】Adobe Illustrator(简称AI2024)软件下载安装(附百度链接)亲测可用
    目录简介下载链接软件功能操作指南新建文档:绘制图形:编辑图形:添加颜色和文本:保存和导出:使用工具:简介AdobeIllustrator(简称AI)是一款由Adobe公司开发的专业矢量图形编辑软件,广泛应用于插画制作、Logo设计、排版、Web设计等领域。作为工业标准的矢量插画软件,AI能够......
  • 2024年度开源新锐项目,MNN等你Pick!
    https://www.infoq.cn/talk/sQ7eKfv1KW1A0kUafBgv投票编号:27号MNN?投票截止时间:?11月13日晚11点投票即可获得定制淘公仔!!!投票即可获得定制淘公仔!!!投票即可获得定制淘公仔!!!(重要的事说三遍)还有:橙子将从投票的同学中抽取10位幸运用户,送出大礼包:双肩包+公仔+保温杯(抽取形式:投票截......