XCTF-level3 WP

Posted on Oct 31, 2020

今天花了一个下午写出来了这样一道ret2libc,题目确实只是一道简单的模板题,但是还是做了我很久,这篇write up也是记录一下

下载附件,得到一个压缩包,解压后获得一个可执行文件和一个libc。

先检查一下安全保护:

发现是32位的,且开启了栈不可执行保护。

先跑一下

就是输入一个字符串,然后打出一个hello world

放到IDA里面看一下

发现main函数里没什么东西,但是在vulnerable_function中有read函数,即溢出点,且可以看出栈基地址与buf第一个元素的地址相差0x88。

然后发现整个程序里面既没有system又没有/bin/sh,所以只能借用libc。

服务器段肯定会开地址随机化,我们无法通过获得的libc直接得到地址。然鹅虽然会有地址随机化,但是在libc中的函数相对位置是固定的。所以可以通过got表泄露的方法来获取基地址(got表中存放了函数的真实地址)。不过由于延迟绑定机制的存在(我个人认为此机制就是在执行到需要链接的函数前都不进行链接),我们需要一个已执行的函数来提供地址计算。于是我们考虑进行两次攻击,第一次攻击获得函数真实地址,第二次攻击调用。

第一次攻击

payload中write_plt,main,1,libc_start_main_got,50,调用write函数将__libc_start_main函数的真实地址打出并将程序再一次返回到main中。

然后我们接受地址并解包:

这样就可以算出基地址和system的地址

然后通过strings -a -t x libc_32.so.6 | grep "/bin/sh" 获得/bin/sh的相对地址,并算出真实地址。

最后的exp就是这样。