zoukankan      html  css  js  c++  java
  • 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
    ')
    buy(1,15,'a'*15)
    use()
    

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

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

  • 相关阅读:
    Swift与OC混合开发
    Swift继承
    Swift方法
    Swift属性
    Swift闭包
    Swift结构体和类
    Swift函数
    Swift基础语法
    Xcode使用篇-重新安装Xcode
    iOS组件化开发-CocoaPods安装
  • 原文地址:https://www.cnblogs.com/Ox9A82/p/6736707.html
Copyright © 2011-2022 走看看