BCTF2017 BabyUse

BCTF2017 BabyUse

问题

问题在于drop函数中在释放块之后没有清空bss_gun_list中的指针。
一般因为存在对bss_gun_flag的验证,所以不会出现什么问题,但是在use功能中没有验证bss_gun_flag

 struct_ptr = bss_gun_list[global_index_saved];

因此use功能存在UAF,不得不说这个设计的还是比较隐蔽的,有点考验眼神。

想法

首先因为题目给了我们分配任意大小堆块的能力,并且我们在阅读代码时候发现并没有对分配的内存进行清零。
这就存在内存未初始化漏洞,我们可以通过布局读出之前释放的usorted块中的fd和bk地址,从而计算出libc的基地址。
其次,我们考虑的是利用UAF漏洞去控制gun结构中的函数表地址,我们在issue部分说了,UAF限制了其它功能唯独没有限制use功能,因此我们的目的就是构造函数表地址,然后进行跳转。

做法

前面提出了利用的思路,但是在实际利用的时候会发现内存未初始化因为存在着'\x00'截断实际上是泄漏不了的。因此这道题的泄漏是一个问题,我在泄漏时尝试了一些内存布局比如

buy(1,15,'a'*15)
buy(1,31,'a'*15)

select(0)
drop(0)

rename(1,15,'AAAA\n')
buy(1,15,'a'*15)
use()

结果发现drop之后再buy的话会挤占掉UAF结构的指针 ORZ。。

这道题应该是晨升师傅做出来的,不得不膜一发。我真是没想到能利用输入时的那个空字节进行部分覆盖,覆盖之后就可以直接得到主模块的基地址和堆基址了。
之后直接泄漏got就能得到libc,再伪造函数表就可以了,这里不多说了。

转载于:https://www.cnblogs.com/Ox9A82/p/6736707.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值