XCTF-level3 WP
今天花了一个下午写出来了这样一道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就是这样。