2024 ByteCTF
ByteCTF
极限逃脱
题目描述:本题需要通过动态调试分析出要输入的内容,可能在某些地方会有提示出现。
这是一个IOS逆向,因为没有设备只能静态分析
流程和安卓逆向大概一致 解压拖进ida
提示输入flag格式 根据"-"进行切割

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

然后往下看注意到
{%@-%@-%@-%@-%@} part5,part2,part3,part4,part5
计算这个字符串的sha256

后面是根据每一部分的长度进行切片操作,然后是一个替换
注意每个部分的起始位置
最后进行比较

最后切片进行替换
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数据

另一部分给的是Edge数据

对应着点和边,我们需要恢复原来的数据
dot数据 每4位为一组

这里采用小端序排序
x1=06 40=1600 y1=4B=75 依次每四位可以拿到所有的点的数据
同理 在边上

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))
得到

然后根据点和线的关系进行绘图
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()

得到flag
2024 ByteCTF的更多相关文章
- HDU 2024 C语言合法标识符
http://acm.hdu.edu.cn/showproblem.php?pid=2024 Problem Description 输入一个字符串,判断其是否是C的合法标识符. Input 输入 ...
- [Luogu 2024] 食物链
[Luogu 2024] 食物链 几句随感 我依稀记得联赛前本来想做这题的时候. 当年啊弱到题目与标签就令我望而生畏. 还有翻阅很多遍那现在已经被遗弃的博客. 看到题解中「三倍数组」的字眼就怕难而放弃 ...
- 【BZOJ 2024】 2024: [SHOI2009] 舞会 (容斥原理+高精度)
2024: [SHOI2009] 舞会 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 368 Solved: 102 Description OIto ...
- loj #2024. 「JLOI / SHOI2016」侦查守卫
#2024. 「JLOI / SHOI2016」侦查守卫 题目描述 小 R 和 B 神正在玩一款游戏.这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点, ...
- 刷题记录:[ByteCTF 2019]EZCMS
目录 刷题记录:[ByteCTF 2019]EZCMS 一.知识点 1.源码泄露 2.MD5长度扩展攻击 3.php://filter绕过正则实现phar反序列化 刷题记录:[ByteCTF 2019 ...
- 杭电2024 C语言合法标识符
链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2024 开始真的对这题是一点头绪都没有,简直了.然后事实证明是我想多了,这题主要是把概念给弄清楚 ...
- 记ByteCTF中的Node题
记ByteCTF中的Node题 我总觉得字节是跟Node过不去了,初赛和决赛都整了个Node题目,当然PHP.Java都是必不可少的,只是我觉得Node类型的比较少见,所以感觉挺新鲜的. Nothin ...
- 延期!欧盟新标EN IEC 62368-1:2020延至2024年7月6日生效
近日,TC108X成员投票同意将EN IEC 62368-1:2020(对应IEC 62368-1第三版)的DOW (Date Of Withdrawn)日期由原先的2023年1月6日延长至2024年 ...
- COJ 2024 仙境传奇(五)——一个天才的觉醒 素数筛
整理模板,同时测了一下memset,for,fill到底谁快... 结果:memset最快,其次是for,fill最慢QAQ.... #include<iostream> #include ...
- BZOJ 2024: [SHOI2009] 舞会 [容斥原理 高精度]
题意:和上题基本一样,求至少k对a>b的方案数.不取模!!! 做k+1遍容斥就行了 高精度超强!!!几乎把所有的都用上了 然后,注意有负数,所以容斥的时候正负分别保存然后再一减就行了 这是我省选 ...
随机推荐
- [rCore学习笔记 02]Ubuntu 22虚拟机安装
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 Ubu ...
- Vue 使用Use、prototype自定义全局插件
Vue 使用Use.prototype自定义全局插件 by:授客 QQ:1033553122 开发环境 Win 10 node-v10.15.3-x64.msi 下载地址: https ...
- CF1988C Increasing Sequence with Fixed OR Solution
题意简述如下: 给定一个正整数 \(n\),请构造一个正整数序列使其满足以下条件并尽可能长:这个序列中每个数都大于等于 \(1\) 且小于等于\(n\):这个序列是单调递增的:这个序列中任意两个相邻的 ...
- AI/机器学习(计算机视觉/NLP)方向面试复习1
1. 判断满二叉树 所有节点的度要么为0,要么为2,且所有的叶子节点都在最后一层. #include <iostream> using namespace std; class TreeN ...
- Jmeter函数助手35-property
property函数用于获取jmeter属性值. 属性名称:填入jmeter的属性名称 存储结果的变量名(可选) 默认值:缺省值,当获取属性值为空时则返回该值 1.查看jmeter全局属性,测试计划右 ...
- Python列表、元组、字典和集合的用法
1.列表 标志符号是[],元素可以修改.删除和新增 1.1 提取元素(索引从0开始计算) testList=['A','B','C',1,'D'] print(testList[1]) #打印索引区间 ...
- 【Java-GUI】02 Dialog对话框
--1.对话框 Dialog java.awt.Dialog 和Window一样可以独立存在的一个窗体 但是注意: 1.Dialog对象一定需要一个依附的父级窗口 2.两种模式(模式和非模式),模式打 ...
- 论文:使用分层强化学习进行空对空格斗(战斗机空对空搏斗)《Hierarchical Reinforcement Learning for Air-to-Air Combat》
- faster-fifo:C++实现的python多进程通信队列 —— 强化学习ppo算法库sample-factory的C++实现的python多进程通信队列 —— python3.12版本下成功通过测试
项目地址: https://github.com/alex-petrenko/faster-fifo 需要注意,该项目给出了两种安装方法,一种是pip从pypi官网安装,一种是从GitHub上的源码安 ...
- 陆吾AI智能机械狗的通讯控制
陆吾AI智能机械狗现在是蛮有名的了,在YouTube上比较火的一个东西了,和波士顿机器狗不同,波士顿机器狗价格昂贵主要原因是其定位于工业领域的机械狗因此采用的是工业级的硬件,但是如果我们采用的家用环境 ...