添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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 是一款非常好玩的游戏,无论你是初学者还是老手,都可以在这个世界中畅快玩乐,享受无尽的乐趣。