一、The malloc maleficarum的历史由来

  • 从2004年末开始,glibc malloc变得更可靠了。之后,类似unlink的技巧已经废弃,攻击者没有线索。但是在2005年末,Phantasmal Phatasmagoria带来了一些其他技巧,用于成功利用堆溢出。

二、The malloc maleficarum的内容

  • 虽然The malloc maleficarum技术最初包含5个内容,但是由于glib 2.23源码的发布,下面有些技术已经废弃了,不能够再使用了:

    • The House of Prime(废弃)。
    • The House of Mind(废弃)。
    • The House of Force。
    • The House of Lore(废弃)。
    • The House of Spirit。

三、漏洞原理

  • 通过free技术来达到任意地址读写的目的。技术中利用free函数来释放一个原本属于栈中的一块地址,将地址free到堆的bin链中,然后实现对栈地址的读写。

漏洞实现

  • ①使用技术在栈上伪造堆块(此时的内存仍然是栈上的)。
  • ②对伪造堆块进行free,free之后伪造堆块被放入bins链中。
  • ③malloc申请该伪造堆块,从而达到对目的地址的读写。

四、注意事项

伪造堆块

  • 由于堆块要被free到bins链中,所以根据glibc的检测规则,申请堆块时,要将申请的堆块后面的两个chunk的prev_size位都要设置为1,所以我们伪造堆块时,也要将伪造的堆块后面的两个堆块的size成员的prev_size位置为1(通过内存地址计算,在指定的内存处赋值),详情见文章:https://blog.csdn.net/qq_41453285/article/details/99053867。
  • 特殊情况:如果伪造的堆块为fastchunk,由于不需要考虑堆块之间的合并问题,所以只要在伪造堆块后面,再伪造一个堆块的prev_size位为1即可,不需要伪造两个堆块。

五、演示案例

#include<stdio.h>
#include<malloc.h>
#include<unistd.h>
#include<string.h>
int main(){malloc(0);  //第一步int size = 0x40;long p = 0;char s[10];sleep(0);*((&p)+1) = size+1+0x10; //第二步sleep(0);*((&p)+3+size/8) = 0x71; //第三步sleep(0); free((&p)+2); //第四步sleep(0);void *q = malloc(size); //第五步sleep(0); printf("%p\n",q); //第六步sleep(0);  strcpy(q,"aaaaaaaa");  //第七步sleep(0);return 0;
}

第一步

  • 因为我们需要在栈上获取一块内存,并将栈上的内存free到堆上来使用,所以此处的malloc函数的功能就是来初始化堆和arena等,要不然栈上的内存free之后没有堆bin链来管理。
  • 可以看到此时系统堆被初始化了,并且bins链中没有任何freechunk。

第二步

  • p是在栈上内存的一块内存,因为我们需要把这块内存来当做堆chunk使用,所以需要构造chunk结构,此步来模仿构造chunk的size成员。
  • 此处我们将伪造堆块的大小设置为0x51(因为p为long类型,在64位下为8字节,因此刚好满足chunk的成员大小结构类型)。

  • 通过stack查看,可以看到0x7fffffffe300是p的地址,然后x查看内容可以看到在p的后面8个字节处,我们成功赋值为0x51。

第三步

  • 我们知道,在正常的对申请中,如果我们申请一个chunk,glibc会设置该chunk的后面两个chunk的prev_size位为1,原因见文章:
  • 于是当我们伪造堆块的时候为了能够符合glibc的要求,也需要对伪造的堆块后面的两个2堆块设置prev_size值为1。
  • 但是此处由于我们申请的chunk为fastchunk,所以不需要考虑chunk之间的合并问题,所以只需要伪造后面一个堆块的prev_size值为1即可。
  • 注意:伪造的时候第一个堆块是0x50大小,于是通过计算,(&p)+3+size/8就是我们伪造堆块的下一个堆块的size成员位置地址处。此处我们将伪造堆块的后一个堆块初始化为0x71大小,在内存中只有0x70大小(prev_size位为1)。

  • 查看伪造堆块的内存,在伪造堆块的内存之后,后一个堆块的size成员内存处被赋值为0x71

第四步

  • 通过上面的一系列步骤,我们已经将伪造堆块构造好了,此时我们就进行free,将在栈上伪造的堆块释放到真正的堆bin链中进行管理。
  • 因为p指针指向的是chunk的perv_size,而free函数传入的是chunk的fd指针,所以此处我们free的参数为(&p)+2。
  • 通过命令可以看到,此时在栈上伪造的堆块,此时被free到堆的fastbins链中了。

  • 因为伪造的堆块是fastbin中的第一个freechunk,并且根据fastbin的单链表结构,其fd成员指向于数值0,查看内存可以看到,伪造堆块的fd被设置为0了。

第五步

  • 此时,我们再去malloc的时候,实际上是将在栈中伪造的堆块申请出来使用了。
  • 可以看到伪造的堆块从fastbins链中被取出来使用了(备注:由于伪造的堆块不是通过正常途径获取的,所以通过heap命令是看不到的,只能通过x查看内存来查看伪造堆块的结构)。

第六步

  • printf打印的也是我们刚刚看到的栈的地址。
  • 因为q指向的是伪造堆块的fd成员,而伪造堆块指针是从prev_size开始的,所以打印地址的时候可以看到,其打印的是在栈上伪造的堆块的地址+0x10位置处。

第七步

  • 此处,我们就是向刚才获得的栈的地方写入内容了。
  • 可以看到字符串被写入到0x7fffffffe310位置处了(fd指针)。


  • 我是小董,V公众点击"笔记白嫖"解锁更多【堆漏洞挖掘】资料内容。

The malloc maleficarum之The House of Spirit漏洞相关推荐

  1. Linux (x86) Exploit 开发系列教程之十 使用 Malloc Maleficarum 的堆溢出

    使用 Malloc Maleficarum 的堆溢出 译者:飞龙 原文:Heap overflow using Malloc Maleficarum 预备条件: 理解 glibc malloc 从 2 ...

  2. SploitFun Linux x86 Exploit 开发系列教程

    SploitFun Linux x86 Exploit 开发系列教程 原文:Linux (x86) Exploit Development Series 在线阅读 PDF格式 EPUB格式 MOBI格 ...

  3. Linux二进制exploit入门

    二进制-linux篇 介绍 逆向 二进制正常情况下,我们不容易获得执行文件的源码, 因此需要用到"逆向"来分析执行程序来寻找漏洞, 所以"逆向"的作用是尽可能把 ...

  4. how2heap glibc 2.27

    文章目录 fastbin dup fastbin reverse into tcache house of botcake house of einherjar house of force tcac ...

  5. how2heap2.31学习(2)

    目录 house_of_botcake house_of_einherjar house_of_lore house_of_mind_fastbin house_of_spirit 前言: 下面是ho ...

  6. how2heap总结

    今天,让我们来总结下how2heap,之前粗略过了一下,但最近发现还是有很多细节不太清楚,于是现在回头来重新调试下how2heap. 就按顺序来吧. 0x01 fastbin_dup: 源码: 1 # ...

  7. ApacheCN 网络安全译文集 20211025 更新

    Android 渗透测试学习手册 中文版 第一章 Android 安全入门 第二章 准备实验环境 第三章 Android 应用的逆向和审计 第四章 对 Android 设备进行流量分析 第五章 And ...

  8. 开源计算机视觉库 OpenCV 被曝两个严重的任意代码执行漏洞(详情)

    聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 开源计算机视觉库 OpenCV中修复了两个高危的缓冲区溢出漏洞,它们本可导致任意代码执行的后果. OpenCV是一款开源库,它由Inte ...

  9. how2heap2.31学习(4)

    目录: large_bin_attack mmap_overlapping_chunks overlapping_chunks poison_null_byte unsafe_unlink 前言: 下 ...

最新文章

  1. 机器学习之XGBoosting
  2. 最小操作系统的代码解释、NASM的初步使用
  3. Spring-AOP 通过配置文件实现 后置增强
  4. 操作系统原理:读写者经典同步问题
  5. axios的content-type是自动设置的吗?
  6. 前端学习(3179):ant-design介绍2
  7. 点到曲线的距离_如何从“圆锥”曲线到圆锥曲线
  8. TensorFlow第十二步 自编码器去噪降维
  9. php中mysqli用法举例
  10. GitHub中README.md文件的编辑
  11. VS2010+Opencv-2.4.0的配置攻略
  12. 纯新手DSP编程--5.30--任务的通信和同步
  13. fer2013人脸表情数据实践
  14. c语言任务设计书,C语言课程设计任务书(必备).pdf
  15. Android 动画录制 GIF录制
  16. mac java环境变量验证_Mac系统 JAVA环境变量配置
  17. ABB机器人Test指令
  18. 关于spark-evn.sh的配置(里面有worker的设置)
  19. 迅雷x下载的东西都变成php格式化,关于文件下载后变成PHP格式的解决办法
  20. python线程isalive_如何在线程类上使用.isAlive()

热门文章

  1. 突破生命法则极限!它会是外星生命的遗传密码?
  2. 揭秘肖特基二极管与电源流串联的反应
  3. 打印机更换感光鼓单元k_感光鼓更换技法_维修技术
  4. JS高级程序设计读书笔记 (第九章 客户端检测)
  5. 四川大学考研真题 || 信息资源管理导论(二)
  6. 歌曲 新贵妃醉酒 - 梦回大唐爱
  7. Typora基础用法
  8. 设置VSCode编辑器、终端字体为微软雅黑Microsoft Yahei,字号大小为11像素
  9. 无线传感网笔记--物理层
  10. CPU/寄存器/内存