• 通过劫持线程arena实现任意地址分配 n1ctf2018_null


    通过劫持线程arena,当堆开了一个线程之后,如果没有做好保护随之的危险也悄然而至 ❗

    BUU上的n1ctf2018_null很好的说明了这个问题

    题目链接:BUUCTF在线评测 (buuoj.cn)

    看一下保护:

    除了pie保护剩下的保护全开了,64位ida载入看一下

    上来是一个输入密码,密码是i'm ready for challenge ,随后登录成功,创建了一个新的线程

    我们进去看看

    是一个死循环,可以看见对输入的chunk大小以及数量都是非常大的,而且程序还有一个溢出我们看一下sub_400bca

    那么可以看见当我们输入的内容比size小的时候,我们可以二次输入这次最大可以输入size的大小,原因是a2没有进行更新,那么这里有溢出点

    我们再看一下它下面的函数

    如果我们能修改此处的地址为system,而参数是/bin/sh那么我们就可以得到shell

    如果我们溢出的字节足够大可以覆盖线程arena,那么我们可将fake_chunk链接到fastbin,进而分配我们想要的地址,但是arena是先mmap出来的,heap是过后才分配出来,所以我们覆盖不了线程arena,但是如果,我们把这块内存耗完会发生什么,那么系统会重新分配mmap一段内存,但是由于它后面是libc的地址,所以它会往前面找一块地址,那么我们输入的内容就可能在线程arena的前面,我们先申请这么大看看

     

    看一下vmmap

    我们看一下此处内容,从链表特征上来看,这是一个线程arena结构,它位于地址较低的地方

    看看我们输入的内容的位置

    计算一下

     

    那么我们加刚刚申请的这个是262个,我们再申请262个看看

    我们输入的数据在它前面,那么可以看见我们再利用二次输入数据是可以覆盖线程arena的

    现在计算偏移进行覆盖

    填充0x50个垃圾数据覆盖到线程arena,这里注意这里有个大小我们不要随意去改变,可以适当改最前面的一个字节,不然会出现一系列的问题

    后面我们在把我们的fake_chunk接上去

    那么此时我们再次申请chunk就会申请到假chunk

    选择0x60201d的原因是这里可以伪造假chunk的size位

    然后我们把0x602038的地方改成system的plt地址

    然后申请0x60大小的chunk就可以申请到fake_chunk

    程序会把rbp-8处的位置给rdi,而且这个位置就是我们申请chunk输入的数据,随后call rax(0x602038)进而得到shell,记得补齐到0x60哦✅

    wp:

     

  • 相关阅读:
    ai智能生成文章-智能生成文章软件
    微信撤回时间延长至3小时,真的?
    SpringBoot+Vue+Element-UI实现人事管理系统
    顺序表专题
    如何提高文章质量,不被发文助手“推荐受影响”
    4-2网络层-路由算法
    【spark】第二章——SparkCore之运行架构及核心编程
    STL(标准模板库)入门
    关于maven读取settings.xml文件的优先级问题
    SVN 索引版本与打包版本号不匹配
  • 原文地址:https://www.cnblogs.com/CH13hh/p/18173314