二进制安全之——堆相关漏洞

目录

 一、堆

1.堆的介绍

2.堆的基本数据结构chunk

(1)mallco_chunk数据结构

(2)free chunk

(3)top chunk

(4)N,M,P位

3.堆空闲块管理结构bin

(1)fast bin

(2)其他bin

①bin 1

②bin 2-bin63

③bin64-bin126

4.malloc基本规则

5.free基本规则

6.tcache

(1)tcache的管理结构

tcache_entry结构体

 tcache_perthered_struct结构体

(2)tcache的管理函数

二、漏洞类型

1.基本的堆漏洞

2.堆缓冲区溢出

(1)常规堆缓冲区溢出

①覆盖堆块内部数据

②覆盖后续堆块数据

(2)off by one

3.use after free

4.double free

三、堆喷射


 一、堆

1.堆的介绍

主要是指用户动态申请的内存(如:调用malloc,alloc,alloca,new等函数)。glibc malloc源码中有三种最基本的堆块数据结构,分别是heap_info,malloc_state,malloc_chunk。

2.堆的基本数据结构chunk

在glibc中,chunk是内存分配的基本单位,可分为alloced chunk,free chunk,top chunk,last remainder chunk四种,最后一种用的比较少,这里着重介绍前三种。

(1)mallco_chunk数据结构

① pre_size/pre_data

前一堆块释放(P=0):前一堆块大小

前一堆块使用(P=1):前一堆块数据

②size

本chunk大小,size为8的整数倍,所以后三个字节有特殊用途

内存中,堆块对齐规则如下:

x32中,按0x8字节对齐,chunk最小为0x10字节;x64中,按0x10字节对齐,chunk最小为0x20字节

(2)free chunk

空闲堆块,其中的fd,bk属于链表指针,有特定的含义,下一堆块的pre_size为当前释放块的大小(含头部信息),下一堆块size域中的p标志通常会被设为0(存在例外,如fast bin)

(3)top chunk

空闲块,该块位于前两种堆块之后,其堆块结构与alloced块的结构类似,重要的是pre_size域和size域。

(4)N,M,P位

N位:#define NON_MAN_ARENA 0x4.用于表示是否属于主线程,0表示主线程的堆块结构,1表示子线程的堆块结构

M位:#define IS_MMAPPED 0x2。用于表示是否由mmap分配,0表示堆块中的top chunk分裂产生,1表示由mmap分配

P位:#define PREV_INUSE 0x1.用于表示上一堆块是否处于空闲状态,0表示处于空闲状态,1表示处于使用状态(被分配),此位主要用来判断free时是否能遇上一堆快进行合并。不过,也存在例外情况,如,fastbin,为了满足快速分配小内存的需求,通常fastbin中的p位保持为1,不参与合并。

3.堆空闲块管理结构bin

当alloced chunk被释放后,会放入bin或者合并到top chunk中去。bin的主要作用是加快分配速度,其通过链表方(chunk结构体中的fd和bk指针)管理

(1)fast bin

fast bin中包含一维指针数组头,用于管理小堆块,在x64系统中,保存的堆块大小在0x20-0x80之间;在x32位系统中,其大小区间0x10-0x40(x86),该区间两边的值都包含在内。fast bin按单链表结构进行组织,用fd指针指向下一堆块,采用LIFO机制,在fast bin中,堆块的p标志都为1,处于占用状态,以防止释放时对fast bin进行合并,用于快速分配小内存

(2)其他

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值