Loading... <!-- wp:paragraph --> <p>今天花了一个下午写出来了这样一道ret2libc,题目确实只是一道简单的模板题,但是还是做了我很久,这篇write up也是记录一下</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>下载附件,得到一个压缩包,解压后获得一个可执行文件和一个libc。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>先检查一下安全保护:</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":336,"sizeSlug":"large"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/10/QQ截图20201031160655.png" alt="" class="wp-image-336"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>发现是32位的,且开启了栈不可执行保护。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>先跑一下</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":337,"sizeSlug":"large"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/10/QQ截图20201031160842.png" alt="" class="wp-image-337"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>就是输入一个字符串,然后打出一个hello world</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>放到IDA里面看一下</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":338,"sizeSlug":"large"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/10/QQ截图20201031160940.png" alt="" class="wp-image-338"style=""></figure></div> <!-- /wp:image --> <!-- wp:image {"align":"center","id":339,"sizeSlug":"large"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/10/QQ截图20201031160950.png" alt="" class="wp-image-339"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>发现main函数里没什么东西,但是在vulnerable_function中有read函数,即溢出点,且可以看出栈基地址与buf第一个元素的地址相差0x88。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>然后发现整个程序里面既没有system又没有/bin/sh,所以只能借用libc。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>服务器段肯定会开地址随机化,我们无法通过获得的libc直接得到地址。然鹅虽然会有地址随机化,但是在libc中的函数相对位置是固定的。所以可以通过got表泄露的方法来获取基地址(got表中存放了函数的真实地址)。不过由于延迟绑定机制的存在(我个人认为此机制就是在执行到需要链接的函数前都不进行链接),我们需要一个已执行的函数来提供地址计算。于是我们考虑进行两次攻击,第一次攻击获得函数真实地址,第二次攻击调用。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>第一次攻击</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":341,"sizeSlug":"large"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/10/QQ截图20201031163432-1.png" alt="" class="wp-image-341"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>payload中<code>write_plt,main,1,libc_start_main_got,50</code>,调用write函数将__libc_start_main函数的真实地址打出并将程序再一次返回到main中。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>然后我们接受地址并解包:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":342,"sizeSlug":"large"} --> <figure class="wp-block-image size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/10/QQ截图20201031173916.png" alt="" class="wp-image-342"style=""></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>这样就可以算出基地址和system的地址</p> <!-- /wp:paragraph --> <!-- wp:image {"id":343,"sizeSlug":"large"} --> <figure class="wp-block-image size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/10/QQ截图20201031174030.png" alt="" class="wp-image-343"style=""></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>然后通过<code>strings -a -t x libc_32.so.6 | grep "/bin/sh"</code> 获得/bin/sh的相对地址,并算出真实地址。</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":344,"sizeSlug":"large"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/10/QQ截图20201031181713.png" alt="" class="wp-image-344"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>最后的exp就是这样。</p> <!-- /wp:paragraph --> 最后修改:2021 年 01 月 02 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,那听听上面我喜欢的歌吧