The malloc maleficarum之The House of Spirit漏洞
一、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漏洞相关推荐
- Linux (x86) Exploit 开发系列教程之十 使用 Malloc Maleficarum 的堆溢出
使用 Malloc Maleficarum 的堆溢出 译者:飞龙 原文:Heap overflow using Malloc Maleficarum 预备条件: 理解 glibc malloc 从 2 ...
- SploitFun Linux x86 Exploit 开发系列教程
SploitFun Linux x86 Exploit 开发系列教程 原文:Linux (x86) Exploit Development Series 在线阅读 PDF格式 EPUB格式 MOBI格 ...
- Linux二进制exploit入门
二进制-linux篇 介绍 逆向 二进制正常情况下,我们不容易获得执行文件的源码, 因此需要用到"逆向"来分析执行程序来寻找漏洞, 所以"逆向"的作用是尽可能把 ...
- how2heap glibc 2.27
文章目录 fastbin dup fastbin reverse into tcache house of botcake house of einherjar house of force tcac ...
- how2heap2.31学习(2)
目录 house_of_botcake house_of_einherjar house_of_lore house_of_mind_fastbin house_of_spirit 前言: 下面是ho ...
- how2heap总结
今天,让我们来总结下how2heap,之前粗略过了一下,但最近发现还是有很多细节不太清楚,于是现在回头来重新调试下how2heap. 就按顺序来吧. 0x01 fastbin_dup: 源码: 1 # ...
- ApacheCN 网络安全译文集 20211025 更新
Android 渗透测试学习手册 中文版 第一章 Android 安全入门 第二章 准备实验环境 第三章 Android 应用的逆向和审计 第四章 对 Android 设备进行流量分析 第五章 And ...
- 开源计算机视觉库 OpenCV 被曝两个严重的任意代码执行漏洞(详情)
聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 开源计算机视觉库 OpenCV中修复了两个高危的缓冲区溢出漏洞,它们本可导致任意代码执行的后果. OpenCV是一款开源库,它由Inte ...
- how2heap2.31学习(4)
目录: large_bin_attack mmap_overlapping_chunks overlapping_chunks poison_null_byte unsafe_unlink 前言: 下 ...
最新文章
- 机器学习之XGBoosting
- 最小操作系统的代码解释、NASM的初步使用
- Spring-AOP 通过配置文件实现 后置增强
- 操作系统原理:读写者经典同步问题
- axios的content-type是自动设置的吗?
- 前端学习(3179):ant-design介绍2
- 点到曲线的距离_如何从“圆锥”曲线到圆锥曲线
- TensorFlow第十二步 自编码器去噪降维
- php中mysqli用法举例
- GitHub中README.md文件的编辑
- VS2010+Opencv-2.4.0的配置攻略
- 纯新手DSP编程--5.30--任务的通信和同步
- fer2013人脸表情数据实践
- c语言任务设计书,C语言课程设计任务书(必备).pdf
- Android 动画录制 GIF录制
- mac java环境变量验证_Mac系统 JAVA环境变量配置
- ABB机器人Test指令
- 关于spark-evn.sh的配置(里面有worker的设置)
- 迅雷x下载的东西都变成php格式化,关于文件下载后变成PHP格式的解决办法
- python线程isalive_如何在线程类上使用.isAlive()