fastbin存储freechunk的单链表结构:
-
第一步:
我们知道被free的chunk会被放入到arena所管理的fastbins链中。如果此时我们malloc一个堆块p,并将其free到fastbin链中,但是我们的p指针没有置空,所以仍然指向于这个freechunk的fd成员处。
char *p=malloc(size);
free(p);
-
第二步:
释放之后,arena管理的fastbin中bin头的fd指针指向于我们申请的这个chunk,p指针就是chunk的fd,如上图所示。
-
第三步:
这个chunk的fd指针本来指向于数值0,此时我们通过p指针将fd指针指向于我们的target地址。
*p=target
-
第四步:
此时我们再去malloc与我们释放的chunk相等大小的chunk,那么被上面被free掉的chunk就会从fastbin单链表中移除,根据fastbin链表的单链表结构,此时arena的fastbin的bin头的fd指针指向于我们的target地址了。
char *q=malloc(size);
-
第五步:
由于此arena的fastbin的bin头的fd指针指向于我们的target地址了。此时我们再去malloc的时候,就是把target这块地址malloc出来给应用层使用了,此时我们就可以使用返回的target的指定地址,对target进行读写了。
char *r=malloc(size);
三、目标地址的构造
-
如果从fastbins中malloc一个freechunk时,
glibc会做以下两个检测:
-
检测1:
检测你要malloc的freechunk的大小是否在该chunk所在的fastbin链的大小尺寸范围内(例如:一个fastbin链所存储的chunk大小必须在0x30-0x40之间,但是你要申请的这个chunk却是0x50,那么就会程序就报错退出)。
-
检测2:
检测你这个freechunk的size成员的PREV_INUSE为是否为1,为1才可以通过检测。
-
检测详情见文章:
https://blog.csdn.net/qq_41453285/article/details/97753705
。
-
因此,如果我们想要从fastbin中malloc出这个target地址来使用,需要做以下的构造:
-
构造什么:
我们需要让target目标地址指定偏移位置处(size成员地址处)的数值与当前fastbin所管理的freechunk的大小范围一致
-
存在的问题:
我们所攻击的target地址的指定偏移位置处(size成员地址处)的数值不一定能够满足当前的fastbin所管理的大小范围
-
如何解决:
虽然我们的target地址处的数值不能满足fastbin的要求,那么可以通过内存地址的偏移,取target地址附近的其它地址,查看其它地址的指定偏移处是否满足fastbin的大小要求,如果有满足的,那么就将这块地址作为攻击目标
-
如下图所示,我们不是直接将target地址作为攻击目标放入fastbin中,因为其指定偏移地址处的伪造size成员数值不能够满足系统要求,因此我们选择了target地址附近的一块其他地址来作为攻击的目标,其指定偏移地址处的数值符合fastbin所管理的要求。
-
构造什么:
如果构造①通过了,那么系统还会检测目标地址偏移的size成员数值的PREV_INUSE为是否为1,以及NON_MAIN_ARENA、IS_MAPPED位的规则。这一系列就是要通过do_check_malloced_chunk函数的检测。
-
do_check_malloced_chunk函数检测见文章:
https://blog.csdn.net/qq_41453285/article/details/97753705
。
-
存在的问题:
如果我们的攻击目标地址的指定偏移的size成员数值的IS_MAPPED位不为1,那么glibc就会认为该地址不是由mmap系统调用所申请的,于是就执行if,但是assert中的断言会是程序终止(因为不满足)。
-
如何解决:
所以我们选取的攻击目标地址的偏移size成员数值的NON_MAIN_ARENA、IS_MAPPED、PREV_INUSE位都要为1,比如当前fastbin所能管理的freechunk大小为0x70~0x80,而伪造的size成员处的数值为0x71、0x72这样的数值不能够符合要求的,但0x7f这样的地址就可以满足需要,因此构造完①之后,攻击目标地址的伪造size成员成员数值的NON_MAIN_ARENA、IS_MAPPED、PREV_INUSE位都要为1,0x7f就可以满足。
四、漏洞的技巧点
-
技巧①:
我们malloc的时候,尽量malloc一个大小在0x70~0x80之间的堆块(因此malloc的参数要为0x60~0x70之间),因为这样我们的目标地址就会被放入0x70~0x80大小范围的fastbin链中,此时我们去构造堆块的时候,由于系统中0x7f这样的数值比较好找,所以能够构造0x7f这样的数值来跳过glibc的检测一。
-
技巧②:
接着技巧①,如果此时我们没有数值为0x7f这样的地址来让我们构造,那么我们就需要使用借助unsortedbin attack了,利用unsortedbin attack向我们的目标地址处写入一个0x7f的数值(见文章:
https://blog.csdn.net/qq_41453285/article/details/99329694
)。
五、__malloc_hook攻击
六、演示案例
-
我是小董,V公众点击"笔记白嫖"解锁更多【堆漏洞挖掘】资料内容。
一、核心思想通过fastbins链的管理,达到目标地址(target)读写二、原理图解fastbin存储freechunk的单链表结构:fastbins是如何存取fastchunk的,见文章:https://blog.csdn.net/qq_41453285/article/details/97613588第一步:我们知道被free的chunk会被放入到arena所管理的f...
[pwn]
fast
bin
att
ack
文章目录[pwn]
fast
bin
att
ack
fast
bin
att
ack
原理double freeuse after freechunk extend需要注意的点:0ctf:babyheap
fast
bin
att
ack
原理
fast
bin
att
ack
是利用
fast
bin
分配原理的
漏洞
,利用要求是我们能够修改“已释放”
堆
块。通常情况下与double fr...
(1)
fast
bin
在执行 free 的时候仅验证了 main_arena 直接指向的块,即链表指针头部的块。对于链表后面的块,并没有进行验证。
(2)malloc申请伪造的
fast
bin
时会检测
fast
bin
的SIZE
a1=malloc();
a2=malloc();
free(a1);
free(a2); //
在程序运行过程中,
堆
可以提供动态分配的内存,允许程序申请大小未知的内存
堆
其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长
我们一般成管理
堆
的那部分程序为
堆
管理器
堆
管理器处于用户程序与内核中间,主要做以下工作
malloc
二、
堆
的历史
Linux早期的
堆
分配与回收由Doug Lea实现,但它在并行处理多个线程时,会共享进程的
堆
内存空间...
0x01
fast
bin
简介
Fast
bin
包含0x20~0x80大小
bin
的数组指针,用于快速分配小
堆
块。
fast
bin
按照单链表结构进行组织,相同大小的
bin
在同一个链表中,fd指向下一个
bin
,采用LIFO(Last In First Out)机制。在
fast
bin
中,
堆
块的inuse标志都为1,处于占用状态,防止chunk释放时进行合并,加快小
堆
块的分配。
正常
fast
bin
的使用
通过这个简单的案例来了解
fast
bin
的单链表结构,malloc和free的过程。
#include<stdio
堆
机制(
fast
bin
等)
想要了解
堆
的机制利用方法必须要先了解
堆
的基本机制以及结构
目前主要使用的内存管理库是ptmalloc,而在ptmalloc中,用户请求的空间由名为chunk的数据结构表示
下面就是一个标准的chunk结构
该chunk中,**prev_size参数为前一chunk(如果未被使用)的大小,size参数为该chunk的大小,而P参数(pre_insue)为标志位,标志前一个chunk的使用情况。**而上述
背景介绍在前一节主要介绍了Glibc的
堆
内存管理的机制,在上一节的基础上,我打算介绍一下针对Glibc
堆
内存管理的攻击。此系列我打算按攻击面是哪一个
bin
来展开,主要分为:
-
fast
bin
的攻击
- small
bin
的攻击
- large
bin
的攻击
- unsorted
bin
的攻击
- top chunk的攻击本文主要介绍
fast
bin
的攻击
fast
bin
漏洞
利
①使用技术在栈上伪造
堆
块(此时的内存仍然是栈上的)
②对伪造
堆
块进行free,free之后伪造
堆
块被放入
bin
s链中
③malloc申请该伪造
堆
块,从而达到对目的地址的读写
三、注意事项
伪造
堆
块:
由于...
Shiro
Att
ack
是一款非常有趣的游戏,它的玩法简单而且非常考验玩家的反应能力。玩家需要控制一个白色的小球,躲避不断飞来的黑色球体,同时还要收集一些好处素材,比如金币、能量球等等。游戏中有多种不同的挑战模式,让玩家可以快速上手,也可以逐渐提高自己的难度。此外,游戏还拥有高品质的音乐和画面,为玩家带来视觉和听觉上的享受。
对于想要下载Shiro
Att
ack
的玩家来说,可以前往各大应用商店搜索下载,如苹果应用商店、Google Play或华为应用商店等等。在下载前,可以先浏览一下游戏的评价和评论,了解一下其他玩家的反馈和评价,再决定是否下载。另外,由于Shiro
Att
ack
是一款免费游戏,玩家可以先试玩一下再决定是否付费购买付费版,享受更多丰富的游戏内容。总之,Shiro
Att
ack
是一款非常好玩的游戏,无论你是初学者还是老手,都可以在这个世界中畅快玩乐,享受无尽的乐趣。