2024 ByteCTF

news/2024/9/23 16:30:47/文章来源:https://www.cnblogs.com/BediveRe/p/18424908

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 = 0with open("ByteBuffer.bin", "rb") as file:ans = file.read()# print(ans)
import structedge_index = 0x3AC
dot_index = 0x1230while edge_index < 0x120C:tmp = struct.unpack("<Q", ans[edge_index : edge_index + 8])[0]edge_index += 8dot1 = struct.unpack("<L", ans[edge_index : edge_index + 4])[0]edge_index += 4dot2 = struct.unpack("<L", ans[edge_index : edge_index + 4])[0]edge_index += 4edge_index += 4length = ((struct.unpack("<L", ans[edge_index : edge_index + 4])[0] + 4) // 4) * 4# print(length)edge_index += 4name = ans[edge_index : edge_index + length].decode()print("line_name:" + name)print("linked_dot1:" + str(dot1))print("linked_dot2:" + str(dot2))edge_index += lengthprint("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 += 4x1 = struct.unpack("<L", ans[dot_index : dot_index + 4])[0]dot_index += 4y1 = struct.unpack("<L", ans[dot_index : dot_index + 4])[0]dot_index += 4dot_index += 4length = ((struct.unpack("<L", ans[dot_index : dot_index + 4])[0] + 4) // 4) * 4# print(length)dot_index += 4name = ans[dot_index : dot_index + length].decode()print("dot_name:" + name)print("x:" + str(x1))print("y:" + str(y1))dot_index += lengthprint("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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/802254.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络流学习记录

CCPC网络赛 G Problem G. 疯狂星期六 Input file: standard input    Output file: standard output Time limit: 1 second      Memory limit: 256 megabytes yyq 和他的朋友们一共 n 个人(编号为 1 到 n ,yyq 编号为 1)去某饭店吃疯狂星期六。第 i 个人初始手中有 a…

PARTIII-Oracle事务管理-事务

10. 事务 10.1. 事务简介 事务是包含一个或多个SQL语句的逻辑、原子工作单元。事务将SQL语句分组,使它们要么全部提交,这意味着它们被应用到数据库中,要么全部回滚,这意味着它们从数据库中被撤销。Oracle数据库为每个事务分配一个唯一的标识符,称为事务ID。 所有Oracle事务…

BPM(业务流程管理)的最佳开源工具

探索最佳开源工具如何优化不同行业的业务流程管理(BPM)场景。在上个月的文章中,我们探讨了 BPM 并总结了构建 BPM 应用程序的三大步骤。 什么是BPM,如何构建一个BPM App? - NocoBase 然而,在各行各业中,BPM 面临着各自独特的挑战。在教育领域,优化招生管理流程和提升学…

谷歌发布新 RL 方法,性能提升巨大;苹果前设计总监正与 OpenAI 合作开发 AI 设备丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的会议」,但内容仅代表编辑的…

文件上传日志包含详解与CTF实战

1. 日志简介 1.1 日志介绍 日志是记录系统或应用程序运行时事件的文件。这些记录可以包括错误信息、用户活动、系统性能指标等,帮助开发者和管理员监控和排查问题。 日志通常会记录多种内容,包括:时间戳:事件发生的具体时间。 用户代理(UA)头:浏览器或客户端的类型和版本…

一位架构师的自述:在尚未踏入的世界成为你自己

这是我参与创作者计划的第1篇文章我叫艾佳,工作经验14年,编程经验30年。 我来自智能平台部,负责标签平台、标签圈人、标签选品、EasyData、算法数据流的架构工作。 致力于批量计算、流式计算、交互式计算的通用化数据应用构建,降低大数据计算的使用门槛。 在此,我跟大家分…

数据结构 - 概述及其术语

数据结构是数据管理和存储的格式,包含物理结构、逻辑结构和数据运算三要素。物理结构关注数据如何存储,逻辑结构关注数据如何组织,数据运算关注数据处理。将深入学习九类数据结构。经过上一章节《数据结构与算法之间有何关系?》的阐述,相信大家对数据结构多少有了点了解,…

DM(达梦数据库基本操作)

1、创建用户 XTF 密码为 XTF123321 SQL> CREATE USER XTF IDENTIFIED BY "XTF123321";2、权限 (1)--给用户建表权限 SQL> GRANT CREATE TABLE to XTF;总共1个语句正依次执行...[执行语句1]: GRANT CREATE TABLE to XTF; 执行成功, 执行耗时7毫秒. 执行号:10322…

PWA入门:手把手教你制作一个PWA应用

根目录创建 manifest.json{"name": "我是pwa","short_name": "pwa是我","start_url": "/", //启动页面,如果首页是https://www.abc.com/,则直接用“/”即可"display": "standalone","ba…

南沙C++信奥老师解一本通题 1281:最长上升子序列

​【题目描述】一个数的序列bibi,当b1<b2<...<bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,...,aN),我们可以得到一些上升的子序列(ai1,ai2,...,aiK),这里1≤i1<i2<...<iK≤N。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如…

css使用@media响应式适配各种屏幕的方法示例

定义和使用 使用 @media 查询,你可以针对不同的媒体类型定义不同的样式。 @media 可以针对不同的屏幕尺寸设置不同的样式,特别是如果你需要设置设计响应式的页面,@media 是非常有用的。 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。 PC端设备…

多智能体协同控制(1)

引言 多智能体系统协同控制算法起源于计算机领域关于分布式计算的研究,后由于数学家们的强势加盟,控制领域的研究一度占领高地。随着人工智能的发展,以多智能体强化学习为代表作的计算机领域专家又重回巅峰。 目前,每年多智能体相关的论文的都浩如烟海,成就了一批手持屠龙…