Skip to main content

HGAME Elden Ring Ⅰ wp

这题想了好久,是想的最久的一道题目了,因为我第一次写这种不是getshell的题目,我的思路如下

我将讲解一下上方的我的思路,首先确定此题目很难用getshell来做,因为系统调用被禁了,我第一次遇到这种情况,于是我搜索google,有一种方式叫做orw(open read write)利用这三个系统调用获得flag文件的内容,但是,想要构造这么一条rop链谈何容易,需要一个超长的栈空间,于是这里就引出两种方法,1:找到一个极其契合的gapgad 2.迁移栈空间 可以很容易的看出第一种方法不太可能实现,那就只有第二种方法

第二种方法我想了很久,究竟怎么实现栈迁移,我第一个试了srop,行不通的原因是vuln函数中没有显式的syscall,函数结束时栈被清理,之前的sigframe就没了,因为srop不行,我就陷入了自我怀疑,莫非真的存在一个极其契合的rop链吗,在这里内耗了很久,虽然花的时间很久,但基本处于0思考的状态,发呆,玩手机,发呆….我一度都想直接问了,不过不行,我相信我能写出来的,然后网上对栈迁移的方法好像不止srop,是我一直以为只有srop,具体的栈迁移方法请参考这篇文章PWN从入门到放弃(12)——栈溢出之栈迁移 – 7i4n2h3n9’s Blog (tianzheng.cool)
写的还是不错的,一步一步的很清楚,所以我就需要将栈迁移至一个确定的地方,并且需要rw,我选的是bss段,这里面也是需要一些特定的rop片段,vuln的片段肯定不够,所以需要先泄露一下libc的地址,用libc中的片段,至于具体的迁移细节,等会看我的exp吧,基本按照上面链接说的做的,只要迁移完毕,你就得到了一个超大的数组,你可以写任意大小的rop链,具体就是调用那三个syscall,具体可看这篇文章C 沙盒逃逸 – CTF Wiki (ctf-wiki.org) exp如下

总结一下,这道题主要就是stack迁移麻烦,但是这道题也教会了我另外一种迁移栈的方式,用leave ret,可以看到leave ret正好是对rsp rbp rip三者的几乎同时改变,先变rbp,再用rbp写入数据到新栈,再迁移rsp。rbp就像是打头阵的感觉,这道题还教会了我一个叫做沙盒的东西,不过管他叫什么,他的原理都是很简单的,就是禁用系统调用,让程序运行更加安全,我觉得这种防护机制简直就是最完美的,完全无法getshell,想做什么都必须调用其他syscall,挺好的。