2024 rctf pwn wp
忙碌的半周……
周四出发去福州→周五铁三→周六酒店打rctf→周日返程+京麒(还延误了将近两个小时^V^)
铁三只出了签到,rctf做了两道题的前期准备工作,京麒零输出;最后铁三二等,京麒也进了(感谢队友orz),结果也算不错
某人又因为被蚊子咬过敏了^V^,还挺严重所以吃了过敏药,吃完整个人又呆又困,去福州之前右胳膊整个肿了,在福州又喜提三四口(一晚上被蚊子吓醒n次),回来之后胳膊好了,右脚踝肿了(肿的我室友以为我脚崴了),蚊子怎么还不灭绝(╯‵□′)╯︵┻━┻
以及没抢上赵孤的票(虽然也算意料之中的事),本来兴趣也不大所以倒也无所谓,与其说我想看不如说我想和hjy一起去看
Taskgo
思路
race,比赛做的时候主要靠试,现在捋一下逻辑
base::TaskRunner::PostTask启动任务,一共两个线程
- MainThread(g_main_thread_task_runner)
- 所有菜单
- MagicCastle::SwitchHandle
- MagicCastle::BuyMS,MagicCastle::DropMS,MagicCastle::LearnMS
- FiveStar
- IOThread(g_io_thread_task_runner)
- RapidAdvance::PickHandle
- RapidAdvance::StartRA
- MagicHeld::Gods
- Log
- NoteStar
Leak
- RapidAdvance和MagicCastle不是一个线程
- CheckMoney会先sleep再结算
- RapidAdvance的CheckMoney sleep卡住的时候可以调用BuyMS把钱刷成负数
集齐三个MS就可以1337调用Gods获得system和BackDoor地址
RCE
BuyMS中会申请一个结构体MagicHeld
DropMS中会调用MagicHeld::~MagicHeld把它释放掉
MagicHeld::Gods的参数也是MagicHeld(废废的一句话(lll¬ω¬))
利用MagicHeld输出Log的地址
调用Log
RapidAdvance里买两次可以调用FiveStar和NoteStar留Comment
所以可以通过race把MagicHeld free掉再通过Comment申请回来改掉,执行BackDoor
流程如下:
- Gods
- DropMS
- RapidAdvance两次,留Comment
race == 玄学
exp
1 |
|
Mine
又是wasm,qwb经典再现
思路
扫雷
- uncover:U扫雷
- mask:M标记
- change:U一次后输入别的字母可以更改整个map的内容
洞在change里
r9b为负数的时候movsx会扩展为负数,可以直接改name的指针,指向flag即可
exp
1 |
|
dwebp
非预期
思路
size过大的话还是会申请feedback结构体,但没有初始化
- 如果是从tcache中申请chunk content指针就是加密过的next指针
- 如果是unsorted bin残留的刚好0x20的chunk,会先放进tcache再返回,同上
- 如果是切割unsorted bin的话不会出现这种问题↑
- 可以用unsorted bin残留的指针改main_arena,造堆块重叠
exp
1 |
|
预期解
还是不够深刻,再贴一次~~~///(^v^)\\\~~~
思路
懒得看原理了
- bad.webp可以直接触发报错,检测是否有洞
- nso.webp是可控溢出POC
bad.webp和nso.webp都会造成越界,但bad.webp的越界是连续的且不可控
nso.webp的溢出不连续,可以通过堆风水避免破坏重要数据
大概思路就是通过overflow把size改大进行越界读写
一个小(da)插曲
有个笨比发base64的时候用的sendline,长度校验没过直接跳过了base64的解码,能触发才怪
exp
1 |
|
rvm
“逆完了没找到洞?” wjy做vm的经典操作罢了
串频了,这是矩阵杯ε=ε=ε=(~ ̄▽ ̄)~
这题比赛的时候没完全逆完
纯逆向题懒得做了, 详情见S1uM4i的wp