misc tiny_traffic
第一道misc就遇到难题了(主要菜(lll¬ω¬))
因为是题需要的知识先写前面了。
序列化
- 序列化: 将 数据结构或对象 转换成 二进制串 的过程
- 反序列化:将在序列化过程中所生成的二进制串 转换成 数据结构或者对象 的过程
java里有序列化的详细解释,其中定义的数据类型与Java的对象 类 包的定义都非常相似,因此可以参考Java来学习
而序列化在Java则需要类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。
(后来研究的半天Java的序列化发现还是不会咋反,主要的Java没学就囫囵了解基础知识,没深入学习,然后发现protocol buffer 反序列 其实支持多项语言的 就用了熟悉的python了,说到底就是不知道序列化是啥,吃了大亏/(ㄒoㄒ)/~~)
但在本次题目中,看到的用不同的序列化工具 protocol buffer(协议缓冲)
里面也需要到包 类相似的数据类型 message则是最具标志性的数据项。
因为protocol buffer是一种结构化数据存储格式,所以稍微了解了下
什么是结构化数据?
其中分为结构化数据 非结构化数据 半结构化数据
我比较喜欢简单点解释
- 信息能够用数据或统一的结构加以表示,称之为结构化数据;
- 信息无法用数字或统一的结构表示,称之为非结构化数据。
结构化数据就是已经是固定而不能更改的数据,就是具有模型的数据,结构就是模型,基于结构化模型。
非结构化一般指无法结构化的数据,如图片 文件视频……
半结构化数据比较有意思,首先它的数据是有结构的,但却不方便模式化,有可能因为描述不标准,有可能因为描述有伸缩性,总之不能模式化。XML和json表示的数据就有半模式的特点。
其实用半模式化的视角看待数据是非常合理的。没有模式的限定,数据可以自由地流入系统,还可以自由的更新。这更便于客观的描述事物。在使用时模式才应该起作用,使用者想获取数据就应当构建需要的模式来检索数据。由于不同的使用者构建不同的模式,数据将最大化的被利用。这才是最自然的使用数据的方式。(这看了知乎的解释,忘了是谁的,直接复制了,有知道的可以告诉我,我标注下,或侵权删)
Protocol buffer 一般用于数据存储 、RPC数据交换,因为他的传输速度比一般的xml josn还要快 使用的空间也小,么么在其中知道什么使RPC数据交换,它和三次握手很像但也没它复杂 应该和udp很像 区别于 rpc会不断请求响应,放在另一页了
Protocol buffer的解释我放另一页了 这个大佬解释的真的好详细 我看的好喜欢!!
附上:Carson带你学序列化:这是一份很有诚意的 Protocol Buffer 语法详解_Carson带你学Android的博客-优快云博客
现在才开始进入主题
下载附件是tinny traffic的文件 看看协议分级、追踪流、搜flag都没用
然后看看字节分组 导出http文件 可以看到有个flag-wrapper的gzip 和br文件(要是不知道可以把其他都导出来,发现都是空的)
然后先打开写着flag的文件(解压就好) 这里我直接文本打开 就是个答案头
接着打开br文件,我现场上网搜了好久……
发现了有个能打开br文件的软件(然而并没有什么卵用,free file viewer pro 这个号称可以打开任何文件 😓),没用,继续搜,从犄角旮旯发现
--2015年9月, Google就已经在官方博客上发布了新的压缩算法Brotli, 自安卓8.1起,谷歌改变了镜像压缩格式,system.new.dat变成了system.new.dat.br。如果要提取官方ROM里的资源就需要先将system.new.dat.br转成system.new.dat,再转为成system.img,再解包system.img提取。
这一段神奇的 没学习过的知识 可能就是你了 然后下载 brotli执行文件先将text.br和serect.br装换成text.new.dat和serect文件。这里打开文本会发现只有text转换成下面的代码文件,serect没有变化。
接上,因为我们没有.list文件并且打开dat文件一看写着“proto3”
码:
syntax = "proto3";
message PBResponse {
int32 code = 1;
int64 flag_part_convert_to_hex_plz = 2;
message data {
string junk_data = 2;
string flag_part = 1;
}
repeated data dataList = 3;
int32 flag_part_plz_convert_to_hex = 4;
string flag_last_part = 5;
}
message PBRequest {
string cate_id = 1;
int32 page = 2;
int32 pageSize = 3;
}
搜索知是protocol buffer结构化数据存储格式并且要把它序列化转换 就可以得到flag(搜索引擎的强大)
将text.new.dat改为.protoc在protoc.exe编译下得到test_pb2.py
然后用这个对secret进行反序列化,把test_pb2.py和反序列化代码放在一个文件夹,反序列化代码如下(为什么会这么做 我估计dalao们都是靠经验做出来了,我搜不到有其他的解释了,如果有知道的请告诉 我,我也想知道):
code: 200
flag_part_convert_to_hex_plz: 15100450
dataList {
flag_part: "e2345"
junk_data: "7af2c"
}
dataList {
flag_part: "7889b0"
junk_data: "82bc0"
}
flag_part_plz_convert_to_hex: 16453958
flag_last_part: "d172a38dc"
根据代码知十六进制转换下得到:
hex(15100450) + "e2345" + "7889b0" + hex(16453958) + "d172a38dc"
CISCN{e66a22e23457889b0fb1146d172a38dc}
参考了 2021 信息安全竞赛初赛部分 Writeup - F5's Notebook
侵权删。