type
status
date
slug
summary
tags
category
icon
password
Bytebuffer
一开始被描述里的flatbuffer框进去了,甚至开始思考构造bfs。。。
实际上个人感觉这个题更像一个misc
一、分析
本题给的是通过flatbuffer序列化后的bin文件
直接丢进010editor
里面给了两种数据
edge(边)和dot(点),像是在暗示构建
图
是这样构析的:
- 上面对应的的8bytes,每四位一组,前一组构成x,后一组构成y,对应一个点(dot)
- 上面对应的8bytes,同理构建成一个边界点(edge)
需要注意的是
FlatBuffers
对序列化基本使⽤原则:- ⼩端模式。FlatBuffers 对各种基本数据的存储都是按照⼩端模式来进⾏的,因为这种模式⽬前和⼤
部分处理器的存储模式是⼀致的,可以加快数据读写的数据。
- 写⼊数据⽅向和读取数据⽅向不同
二、解题
edge和dot都已这样的结构来分割
以图中为例子,从0x3AC开始,前8位是无效数据;0x3B4 - 0x3BC是坐标数据;再后8位是无效数据;最后八位是标志。其它点同样处理
其实就是把edge和dot的坐标提取出来,搜索可以知道一个绘图的库matplotlib,让ai搓个脚本再修改修改即可
三、EXP
babyapk
一、探索
jadx打开,发现是flutter逆向
网上搜索可以找到:
下载好对应工具
- 使用环境:
kali(WSL)
使用
blutter.py
,解包出如下五个文件- asm⽂件夹⾥⾯存放dart⽂件的反编译结果
- ida_script文件夹⾥⾯存放着可以在ida使⽤的脚本,⽤来恢复so⽂件的符号表
- objs.txt和pp.txt有对象池的⼀些东⻄,逆向的时候作⽤不⼤
- frida脚本是⼯具⾃动编写的,可以⽤来hook .so层的⼀些函数(需要⾃⼰替换偏移)
二、分析
在
asm\babyapk\main.dart
能分析找到flag的格式,以及下面的
cmp
指令很像是验证flag长度为45接着能找到关键输出的地方,这个方法在
[package:babyapk/src/rust/api/simple.dart]
跟踪过去
类似操作,可知这里内容基本上都是和rust交互
加密在flutter与rust交互的so⾥⾯,即
librust_lib_babyapk.so
找到关键函数
三、解题
z3解出来:
拼起来就是32e750c8fb214562af22973fb5176b9c
函数上面的内容就是在其中插入4个
-
可以写脚本复制逻辑过来爆破
bytekit
一、探索
题干翻译过来就是:
我们的一台物理服务器被黑了,我们重装了操作系统,但还是有些东西残留在上面。你能找到它吗?
- 执行
./run_qemu.sh
并使用用户名 root 和空密码登录。
- 登录后,执行
./getflag.sh <你的输入>
。
- 之后它会重启。
- 重启后,重新用 root 和空密码登录,再次执行
./getflag.sh <你的输入>
,你就会得到你的 flag。
查看getflag.sh的内容
大概就是输入一串字符串,返回flag
重点关注bios.bin文件
用
binwalk
对他进行查看发现了uefi固件分析
二、分析
搜索uefi相关内容,找到
配置好后
成功
在
"D:\CTF\bytectf2024\bytekit\ByteKit\ByteKit\modules\ByteKitLoaderDxe"
这里,可以看到Bytekit开头的文件,丢进IDA一眼ollvm,d810启动!!!
得到加密逻辑
理一下逻辑
这样比较明显,就是
address1
中取0x6C4的数据,与address2
的地址 + 12后的11个数据进行异或三、解题
各取11个数据进行测试,按结果来看明显是个PE文件
打个idapython
成功搞出PE文件test,继续丢进IDA
关键部分在这里,
key_data
内,每三个一组,分别对应xorkey
、index
、xorlen
回去验证
- 作者:Sh4d0w
- 链接:https://sh4d0w.life//article/10d50fad-5ffd-8076-9947-ee8aeda7970e
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章