2017 HITB CTF 新加坡 Pwn Writeup

<–more–>

程序分析

这是一个菜单程序。

其有三个主要功能

功能一 go


首先,其会询问你要挑战的总关卡
之后会再一次询问,是否要增加关卡

有一个地方值得注意,如果我们在询问level的时候 输入 负数,那么程序将打印出Coward,然后继续询问因此,这一次无论大小,Any more后输入的值都将直接加在v5上, 然而现在的v5还没有进行初始化。
以及,第二次询问的时候没有判断是否小于0.
我们可以看到 level 函数 如图

往buf 读入了0x400的数据,有一个明显的栈溢出。

检查一下程序开启的保护。

功能二 Hint


从汇编代码中,我们可以看到,当执行 hint后,无论在哪个分支上,system函数地址都被放到了栈上。

功能三 give up

退出程序,

利用思路

我们在调试的时候会发现,未初始化的v5 和 system的地址复用了,这就意味着我们已经得到了一个地址,但是由于开启了pie,我们还是不不能完全的控制这个地址去getshell。

题目给了libc 那么我是否能利用libc?


在libc中,我们发现,system的地址和one gadget rce 的地址 相差0x4526a-0x45390

那么如果我们对那个未初始化的参数进行减法运算最后是不是就而已调用到one gadget rce了呢?

那么接下来的另外一个问题,就是如何控制eip,跳转到这个参数地址了

vmmp中存在 vsyscall

构造一个ret rop链,不断的去接近目标地址即可。