Loading... 此题是一个 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](pwnable.kr) 没刷过,也不知道原题是什么,反正先 IDA 里面看一下再说 <div style="text-align:center"><img src="https://www.cjovi.icu/usr/uploads/2021/03/3771062649.png "></div> 主要就是 read 造成的栈溢出,然后没有输出函数,和昨天做的 [De-ASLR](https://www.cjovi.icu/WP/1227.html) 有许多分相似之处,好在此题用的是 read,不会自动在末尾加 '\x00',所以上次用不到的修改 got 的方法此次就可以用了。 可用的方便 gadgets 不多,大概只能用 ret2csu 来控制寄存器。 ### 爆破法 注意一下这个巧合 <div style="text-align:center"><img src="https://www.cjovi.icu/usr/uploads/2021/03/3226824632.png "></div> <div style="text-align:center"><img src="https://www.cjovi.icu/usr/uploads/2021/03/1785587101.png "></div> 可见 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 了。 最后修改:2021 年 03 月 31 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,那听听上面我喜欢的歌吧