• Fastbin attack&&Double free和Unsortbin leak的综合使用


    Fastbin attack&&Double free和Unsortbin leak的综合使用✅

    今天做一个综合题目,包括利用Fastbin attack实现多指针指向一个地址,以及利用Unsortbin leak泄露libc基地址和修改__malloc_hook地址为one_gadget

    题目是buuctf上面的一道题目,题目链接 https://buuoj.cn/challenges#babyheap_0ctf_2017

    checksec看一下保护

    太绿了.....保护全开,不过对于堆题目这也狠正常

    那么就64位ida载入

    也是有一个菜单和一些功能函数

    一个一个看

    那么第一个就是申请多大的chunk没有对其赋值

    第二个问题来了,没有对size检查,那么可以进行溢出修改到别的chunk

    第三个函数把指针什么的都置为0了,那么就没有UAF了

    第四个函数可以打印出chunk的内容

    仔细检查程序,发现并没有后门函数,那么现在思路是看看能不能能泄露libc,把一个函数替换成one_gadget得到shell

    这里Unsortbin leak 可以泄露出libc地址,为什么呢?

    Unsortbin leak原理:✅

    当只有一个unsortbin被free的时候,它的fd、bk指向一个指针,这个指针指向top chunk地址,这个指针保存在main_arena+0x58偏移处,而main_arena是libc的data段中,是全局静态变量,所以偏移也是固定的,根据这些就可以计算出libc的基地址了

    那么要想把它打印出来还不行,因为我们不能打印已经free的chunk(指针置为0了),但是因为是64位的chunk,如果要利用打印上一个chunk来打印这个chunk的内容,那也会有很多的\x00来进行截断,所以也是行不通的,那么我们可以找一个指针指向这个已经free的unsortbin,然后打印这个指针对应的chunk,问题似乎就解决了,那么该怎么做到呢?

    如果我们可以利用Fastbin attack先将其加入fastbin 链中然后就有了一个指向它的指针,然后再malloc回来再将他改回原来的大小,再次free得到unsortbin,再打印刚刚指向它的chunk就得到main_arena+0x58处的地址了!

    效果如下

    可以看见chunk2成功指向chunk4

    这个时候我们改变它的size为0x21因为malloc fastbin 有检查, chunksize 必须与相应的 fastbin_index 匹配,所以我们覆盖 chunk 4 的 size 为 fastbin 大小来通过检查

    效果如下

    chunk4变成了fastbin

    再次malloc两个大小为0x10的chunk将这两个chunk2和chunk4拿出来,然后再进行修改chunk size大小为0x91再次申请0x80大小chunk(申请到chunk4)然后再次进行free得到unsortbin

    那么就可以得到libc基地址,和one_gadget地址

    效果如下

    之后我们申请0x60大小chunk将unsortbin进行分割,使其进入fastbin,然后伪造距离__malloc_hook较近的假的chunk来修改__malloc_hook,这个地方一般取__malloc_hook-35这个地方的size比较大而且再fastbin范围内(我本地是0x74)

    我们再次修改fd指针

    效果如下

    再次申请两个大小为0x60的chunk即可申请到我们设置的fakechunk然后修改__malloc_hook为one_gadget就好了,值得注意的是,找的的one_gadget可以有一点点差别,因为libc分为不同的小版本,不同的版本有区别,我们可以把找到的one_gadget加0x10或者减去0x10再试试

    最后看看我们做的所有工作

    总的来说这题的难度还是不小的,很需要综合能力

    最后完整wp


    __EOF__

  • 本文作者: CH13hh
  • 本文链接: https://www.cnblogs.com/ch13hh/p/18162356
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    PyCharm安装教程,新手详细
    【优化调度】基于改进遗传算法的公交车调度排班优化的研究与实现(Matlab代码实现)
    metaRTC5.0编程之p2p网络穿透(stun)指南
    Apache Griffin
    VS2019代码中包含中文内容导致的编译错误和打印输出乱码问题
    知识产权与标准化
    将时间序列转成图像——短时傅里叶方法 Matlab实现
    Centos安装mongodb
    9.8day58 单调栈
    MySQL索引原理及慢查询优化
  • 原文地址:https://www.cnblogs.com/CH13hh/p/18162356