首页
社区
课程
招聘
[原创] 关于ciscn决赛第二天 ctfpwn01 vm 题目的简析
发表于: 1天前 559

[原创] 关于ciscn决赛第二天 ctfpwn01 vm 题目的简析

1天前
559

叠甲:本人和队友没有对题目的任何意见,这篇文章是疲惫+情绪激动的第二人格上号所写,第一人格已燃成灰.jpg

不好意思,附件等我忙完放上来,或者其他师傅的公众号里好像有附件

来简单讲讲这个题目,一个让我晚上惊醒发现被窝里全是 push pop 的 vm 题目。

首先,vm 题目最重要的肯定是逆向,只有过得了指令逻辑才能谈未来。

OK,这里压力逆向手逆向的结果如下:

(比赛时时间比较紧张,发文前我也没 check,有错误还请多担待)

整个逻辑是先申请 0x900 的堆块作为存放 code 的内存和 stack,然后申请 0x58 的 opcode,结构为指向 code 的指针、bp 指针、sp 指针和 8 个 8 字节大小的寄存器。

可以看到,除去一些很常规的指令,唯一有内存操作的只有 case 6,即有 memcpy 函数的指令。

那很明显,就要集中看这个指令漏洞在哪里。

一开始变量类型没设置好的话会比较难察觉,但是直接查看汇编时会发现,dst 和 src 的地址是类似 mem2+offset,而这个 offset 是从寄存器中取的值,这个值先取单字节,再被 *8

此时,可以注意力惊人的发现,这个 mem2 到 opcode 的大小是小于这个 offset,而 dst 和 src 的地址都是 mem2+offset,也就是说是越界读写!(读写到 stack,再进寄存器就可操控值了)

经实测,将寄存器设置为 255,在 *8 后会覆盖/读取到 opcode 的值,越界读写的猜想证明成功。

而同时,最后面的 default 里有 free,它在满足一定条件后不仅可以释放原先堆块申请新堆块,还会好心地把原先内存、寄存器值复制过去,并且重新读取 code。

这样 free 完,新的堆块上方就存在了一个有 libc unsorted bin 堆块,虽然有 0x900 距离,但看上去近在咫尺。

赢了吗?没有。

在众多指令中,只有 push 和 pop 有实际读写能力,因此,得仔细查看它们的限制。

此时发现,push 被限制了,在指令里有这么判断条件:sp 地址 >= mem 地址才能执行 push,这个 mem 指针地址在栈上,很不幸,写能力被限制在堆地址及更高的地址了。

而 pop,读取 libc 的关键,它的 check 条件是 bp >= sp 即可,这两个值都是在 opcode 中可控的。

那么,胜利的方程式已经写好了:

先利用越界读写保存堆地址,地址进入 stack 再进入 reg,将其在寄存器改偏移后利用越界读写操控 sp、bp,将unsorted bin 的libc 地址 pop 进入 reg。

然后同样的方法操控 sp、bp 读 environ 栈地址,最后操控 sp 到栈上,用push覆盖 main函数 返回地址打 ogg。

其中要保证 0x61 的堆块 size 和 code 指针指向正确。

(当时和队友打 awdp 打的已经过载了,只能想到这种攻击方法了,有更好的方法欢迎大家在评论区评论)

"如今 flag 就在眼前,我必须考虑这是否是我此生唯一的机会"

看上去很难的一条路径,实际写指令也很痛苦。

最后,在距比赛结束还有不到一个小时的时候,队友写出了打通本地的 exp,如下:

意气风发啊,队友!

也就是说,是我们赢了!

然后,就发现了这题目前零解是有原因的。

远程的交互竟然与本地不一样,而题目附件和题目描述中并没有给出任何说明

在远程的交互中,发送的内容会被输出回显并加上 \r\n ,不可见字符会变成 ^* (*代表可见字符,如 \x00 会变成 ^@),是与 qemu 启动的内核题目交互很像的形式。

而 exp 在第二次输入时被截断。

此时,经过询问裁判,裁判与出题人确认后,给我们的答复仅有:"题目附件并没有问题,远程运行的程序与题目附件一致"

我当然知道附件没问题啊,甚至在这种时刻,仍有一个什么也不懂的裁判在不停地质疑我们,为什么不走平台,为什么...
可能这名裁判觉得,他们的比赛办的很好,发出质疑的选手一定是个人有问题。

当我们再询问远程的表现时,裁判模糊的告诉我们:"具体细节不能告知,或许跟容器有关"

"这个也算考点吗?"

"……"

唯有沉默...

当我们连启动脚本和远程环境都没有就让我们猜原因,好的,很符合我对 ctf 题目的印象,远程吗,总有打不通的时候。也许就是我们技不如人,有什么细节疏忽了导致的。

可是这种毫无征兆的 EOF 该怎么调试呢?

或许经验丰富的师傅们,或许接触过这类问题的师傅们能立即知道是为什么。但很可惜,我们缺乏经验,或者应该说,我们认为 ctf pwn 不会在附件和题目描述以外的地方设置无必要的交互门槛。

而我和队友当时在花了三个小时逆向、分析、写exp,而此刻比赛只剩半个小时,没有遇到过这种情况的境地,甚至没有能本地搭建环境的办法,猪脑已过载,开始猜测吧。

好吧,也许是远程堆块不一样,也许是 io 有问题,要用特别的方法传输。

也许是某些字符截断了呢?

带着不甘与疑惑,我们没有在结束前打通远程,我们看到了这题有别的学校拿到了一血,而我们很可惜地错过了解出题目的机会。

......

真是抱歉啊,没能让国赛大人尽兴。


传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!

最后于 20小时前 被一叶梦花编辑 ,原因:
收藏
免费 3
打赏
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  JnamerZ   +1.00 2026/09/01 感谢分享~
最新回复 (0)
游客
登录 | 注册 方可回帖
返回