PWNABLE.TW-unexploitable-WP

Posted on Mar 31, 2021

此题是一个 rop,分数挺高,难度不大。

The original challenge is on pwnable.kr and it is solvable.

This time we fix the vulnerability and now we promise that the service is unexploitable.

题目描述是这样的,pwnable.kr 没刷过,也不知道原题是什么,反正先 IDA 里面看一下再说

主要就是 read 造成的栈溢出,然后没有输出函数,和昨天做的 De-ASLR 有许多分相似之处,好在此题用的是 read,不会自动在末尾加 ‘\x00’,所以上次用不到的修改 got 的方法此次就可以用了。

可用的方便 gadgets 不多,大概只能用 ret2csu 来控制寄存器。

爆破法

注意一下这个巧合

可见 read 和 one_gadget 是在同 0x10 个页中的,所以写 read 的 got 的低 16 位,爆破 4 位就可以直接执行 one_gadget,概率 1/16。同时不要高估 0x100 的长度,写满了也是无法满足 [rsp + 0x70] == NULL 的条件的,所以需要做一次栈迁移,手动调用 read,指定较长的长度再来写才能 getshell。

构造 syscall 法

libc 中 syscall 还是很多的,基于 aslr 的低 12 位不变性,可以在 &sleep 附近寻找 syscall 的 gadget,覆写 sleep 的 got 表最低字节,就可以通过 sys_execve 来 getshell 了。