堆漏洞挖掘
董哥的黑板报
90后程序员!
展开
-
堆漏洞挖掘:02---堆的glibc实现与Arena(struct malloc_state、struct _heap_info)
前言:堆的glibc实现主要包括struct _heap_info,struct malloc_state,struct malloc_chunk这3个结构体 在介绍结构体之前需要介绍一下非常重要的arena(竞技场)一,什么是Arena我们知道一个线程申请的1个/多个堆包含很多的信息:二进制位信息,多个malloc_chunk信息等这些堆需要东西来进行管理,那么Arena就是来管理线...原创 2019-07-22 13:13:00 · 3741 阅读 · 2 评论 -
堆漏洞挖掘:05---堆的调用流程与相关概念
一、堆的调用流程第一步:当应用程序“第一次”使用malloc函数申请动态内存时,glibc库会向内核申请一块非常大的动态内存,这块动态内存会比malloc申请的大小大很多 brk/mmap系统调用:glibc库使用的是brk或者mmap系统调用来想内核申请内存空间的。至于两者有什么区别后面介绍第二步:glibc申请到这块大的内存之后,根据malloc需要的大小,然后切割...原创 2019-07-23 18:40:28 · 1052 阅读 · 1 评论 -
什么是堆漏洞挖掘?堆的glibc实现、Arena(main_arena、thread_arena)
一、什么是堆在程序运行过程中,堆可以提供动态分配的内存,允许程序申请大小未知的内存 堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长 我们一般成管理堆的那部分程序为堆管理器堆管理器处于用户程序与内核中间,主要做以下工作malloc free二、堆的历史Linux早期的堆分配与回收由Doug Lea实现,但它在并行处理多个线程时,会共享进程的堆内存空间...原创 2019-07-22 12:53:10 · 3353 阅读 · 0 评论 -
堆漏洞挖掘中的Chunk分类(allocated chunk、free chunk、top chunk、last remainder chunk)
此图是在上篇文章介绍arena时用到的,我们可以看到:堆块被分为不同的种类,下面我们将来介绍这些chunk的分类每一类就是一个malloc_chunk结构体,因为这些chunk同属于一个堆块,所以在一块连续的内存中,只是通过区域中特定位置的某些标识符加以区分glibc给我们申请的堆块主要分为以下几类:allocated chunk free chunk top chunk...原创 2019-07-22 17:07:46 · 3731 阅读 · 0 评论 -
堆漏洞挖掘中的bins分类(fastbin、unsorted bin、small bin、large bin)
一、bin链的介绍bin是一个由struct chunk结构体组成的链表 前面介绍过,不同的chunk根据特点不同分为不同的chunk,为了将这些chunk进行分类的管理,glibc采用了bin链这种方式管理不同的chunk 不同的bin链是由arena管理的 bin链中的chunk均为free chunk二、bin链分类根据bin链成员的大小不同,分为以下几类:fast bi...原创 2019-07-23 18:40:24 · 11765 阅读 · 6 评论 -
堆的调用流程、堆漏洞挖掘中的malloc_chunk结构体分析
struct malloc_chunk { INTERNAL_SIZE_T mchunk_prev_size; INTERNAL_SIZE_T mchunk_size; struct malloc_chunk* fd; struct malloc_chunk* bk; struct malloc_chunk* fd_nextsize; /* doub...原创 2019-07-24 15:28:59 · 2521 阅读 · 2 评论 -
堆漏洞挖掘——多线程中的堆内存结构
一、主线程的堆内存结构当程序只有一个线程(主线程)时,程序申请的堆是在堆区的(heap) 如果通过查看内存段信息:如果heap与程序的data段相邻,则堆块是有brk系统调用获得的,否则是由mmap系统调用申请的(mmap不与data段相邻)演示案例#include <unsitd.h>#include <malloc.h>int main(){ ...原创 2019-07-29 17:36:13 · 1198 阅读 · 2 评论 -
堆漏洞挖掘中chunk的NON_MAIN_ARENA、IS_MAPPED、PREV_INUSE位
struct malloc_chunk { INTERNAL_SIZE_T mchunk_prev_size; INTERNAL_SIZE_T mchunk_size; struct malloc_chunk* fd; struct malloc_chunk* bk; struct malloc_chunk* fd_nextsize; /* d...原创 2019-07-24 15:29:44 · 2132 阅读 · 7 评论 -
堆漏洞挖掘中chunk的mchunk_prev_size成员的空间复用
struct malloc_chunk { INTERNAL_SIZE_T mchunk_prev_size; INTERNAL_SIZE_T mchunk_size; struct malloc_chunk* fd; struct malloc_chunk* bk; struct malloc_chunk* fd_nextsize; /* doub...原创 2019-07-28 09:17:48 · 1885 阅读 · 0 评论 -
堆漏洞挖掘——malloc一个chunk的检测机制
引言:我们知道:当malloc时,如果fastbins、smallbins中有满足需求的chunk可以使用时,malloc就会在相关的bins链中寻找可用的freechunk来使用 但是取走一个freechunk是有检测机制的,一、fastbin的检测机制机制规则如下:检测1:检测你要malloc的freechunk的大小是否在该chunk所在的fastbin链的大小尺寸范围内(例...原创 2019-07-30 10:59:44 · 2748 阅读 · 3 评论 -
堆漏洞挖掘中chunk的实际大小、最低大小、 mchunk_size成员
struct malloc_chunk { INTERNAL_SIZE_T mchunk_prev_size; INTERNAL_SIZE_T mchunk_size; struct malloc_chunk* fd; struct malloc_chunk* bk; struct malloc_chunk* fd_nextsize; /* d...原创 2019-07-28 09:33:24 · 3836 阅读 · 0 评论 -
堆漏洞挖掘中bins的单向链表、双向链表存储结构
前言:前面介绍过:fastbins为单链表存储。unsortedbin、smallbins、largebins都是双向循环链表存储 并且free掉的chunk,如果大小在0x20~0x80之间会直接放到fastbins上去,大于0x80的会放到unsortedbin上,然后进行整理那么这些链表在glibc中到底是如何存储的哪,本片文章进行介绍一、fastbins的单向链表存储结构f...原创 2019-07-28 15:31:23 · 3631 阅读 · 4 评论 -
堆漏洞挖掘中的top chunk的向前合并
一、top chunk当我们分配一块堆内存时,top chunk是出于地址的最高处的,其前面就是我们所申请的chunk二、top chunk的合并操作如果top chunk前面的chunk不是fast chunk并且处于空闲,那么top chunk就会合并这个chunk 如果top chunk前面的chunk是fast chunk,不论是否空闲,top chunk都不会合并这个ch...原创 2019-07-28 18:29:58 · 2369 阅读 · 0 评论 -
堆漏洞挖掘:19---_lib_malloc函数源码详解
一、_lib_malloc函数介绍当我们在应用层调用malloc申请堆的时候,在glibc中实际上调用的是_lib_malloc函数,但是_lib_malloc函数只是用来简单的封装_int_malloc函数的,_int_malloc函数才是申请堆的核心函数二、__malloc_hook全局变量函数介绍:_lib_malloc首先通过__malloc_hook全局变量获取一个函数指针,然...原创 2019-08-10 08:45:44 · 1287 阅读 · 0 评论 -
堆漏洞挖掘中chunk的malloc、free
malloc的机制如果程序是第一次mallloc:会创建一个很大的“top chunk” 如果程序是第二次及之后malloc:会去先向bins链表寻找空间,如果没有再去向“top chunk”要空间;如果“top chunk”使用完了再通过glibc重新申请一块新的“top chunk”一、程序第一次malloc如果程序是第一次malloc,glibc会向内核申请一块很大的堆内存空间供...原创 2019-07-29 11:14:42 · 1483 阅读 · 6 评论 -
堆漏洞挖掘中的malloc_consolidate与FASTBIN_CONSOLIDATION_THRESHOLD
一、何为consolidate我们知道大于0x80的chunk被释放之后就放到了unsortedbin上面去,但是unsortedbin是一个未分类的bin,上面的chunk也处于未分类的状态。但是这些chunk需要在特定的条件下被整理然后放入到smallbins或者largebins中 这个整理的过程被称为unsortedbin的“consolidate”,但是“consolidate”是...原创 2019-07-29 12:59:52 · 4089 阅读 · 0 评论 -
堆漏洞挖掘:21---_lib_free函数源码详解
一、_lib_free函数简介在应用层调用free函数,在glibc中其实调用的就是_lib_free函数 与_lib_malloc函数一样,_lib_free函数会调用_int_free函数,_int_free函数此时释放堆内存的核心函数函数的主要内容包括:①检查是否有__free_hook ②如果堆块为NULL,则什么都不做 ③如果是mmap的堆块,调用munmap进行释...原创 2019-08-10 14:08:52 · 1179 阅读 · 0 评论 -
堆漏洞挖掘中fastbins的大小(DEFAULT_MXFAST、MAX_FAST_SIZE)
一、fastbins大小的默认最大值(DEFAULT_MXFAST)fastbin中支持的fastchunk的默认最大值为128字节。在glibc中用“DEFAULT_MXFAST”宏定义表示二、fastbins大小的最大值(MAX_FAST_SIZE)但是其支持的fastchunk的数据空间最大为160字节。在glibc中用“MAX_FAST_SIZE”宏定义表示最大值的g...原创 2019-07-30 09:02:18 · 1993 阅读 · 0 评论 -
堆漏洞挖掘中last remainder的深度剖析
一、什么是last remainder如果在bins链中存在freechunk时,当我们去malloc的时候,malloc的请求大小比freechunk的大小小,那么arena就会切割这个freechunk给malloc使用,那么切割之后剩余的chunk就被称为“last remainder” 当产生last remainder之后,表示arena的malloc_state结构体中的last...原创 2019-07-30 18:11:24 · 2567 阅读 · 14 评论 -
堆漏洞挖掘:23---The malloc maleficarum
一、The malloc maleficarum的历史由来从2004年末开始,glibc malloc变得更可靠了。之后,类似unlink的技巧已经废弃,攻击者没有线索。但是在2005年末,Phantasmal Phatasmagoria带来了一些其他技巧,用于成功利用堆溢出二、The malloc maleficarum的内容虽然The malloc maleficarum技术最初包含...原创 2019-08-11 11:29:09 · 846 阅读 · 0 评论 -
堆漏洞挖掘中堆块的unlink
一、unlink的概念双向链表中移除/添加一个chunk时,会发生断链的操作,这个断链的过程就叫做unlink 注意事项:unlink不发生在fastbin和smallbin中,所以fastbin和smallbin容易产生漏洞二、可能发生的场景malloc时:从恰好大小合适的largebin中获取chunk,发生unlink 从比malloc要求大的largebin中取chunk...原创 2019-08-08 12:03:16 · 1075 阅读 · 2 评论 -
堆漏洞挖掘——__lib_malloc函数、_int_malloc函数、__lib_free函数源码详解
_int_malloc函数介绍当我们在应用层调用malloc申请堆的时候,在glibc中实际上调用的是_lib_malloc函数,但是_lib_malloc函数只是用来简单的封装_int_malloc函数的,_int_malloc函数才是申请堆的核心函数 _int_malloc会根据应用层用户申请的内存块大小,从而分配相应的chunk给用户使用函数的分配堆内存的主要执行流程:①请求...原创 2019-08-10 13:50:40 · 4607 阅读 · 0 评论 -
The malloc maleficarum之The House of Force漏洞
一、漏洞原理攻击者通过堆溢出或者其他方式,控制到topchunk的size成员,这样我们就可以使topchunk的地址超出正常的堆段的地址,这样我们就可以控制到超出堆段之外的内存二、漏洞实现①通过堆溢出或其他方式,控制到topchunk的size成员 ②将topchunk的size成员变为一个非常大的数,这样topchunk就会超出内存中的堆段,从而访问到其他段的内存地址(got表的地...原创 2019-08-11 11:52:30 · 927 阅读 · 0 评论 -
The malloc maleficarum之The House of Spirit漏洞
一、漏洞原理通过free技术来达到任意地址读写的目的。技术中利用free函数来释放一个原本属于栈中的一块地址,将地址free到堆的bin链中,然后实现对栈地址的读写二、漏洞实现①使用技术在栈上伪造堆块(此时的内存仍然是栈上的) ②对伪造堆块进行free,free之后伪造堆块被放入bins链中 ③malloc申请该伪造堆块,从而达到对目的地址的读写三、注意事项伪造堆块:由于...原创 2019-08-11 12:09:15 · 1012 阅读 · 4 评论 -
堆漏洞挖掘——fastbin attack漏洞
一、核心思想通过fastbins链的管理,达到目标地址(target)读写二、原理图解fastbin存储freechunk的单链表结构:fastbins是如何存取fastchunk的,见文章:https://blog.csdn.net/qq_41453285/article/details/97613588第一步:我们知道被free的chunk会被放入到arena所管理的f...原创 2019-08-12 18:35:35 · 3203 阅读 · 5 评论 -
fastbin attack漏洞之__malloc_hook攻击
__malloc_hook攻击原理为fastbin attack,见文章:https://blog.csdn.net/qq_41453285/article/details/99315504一、概念通过fastbin attack,我们可以发起__malloc_hook攻击,将__malloc_hook作为我们的target二、攻击方向方向①:我们可以将__malloc_hook函数...原创 2019-08-12 19:10:00 · 5693 阅读 · 3 评论 -
堆漏洞挖掘——unsortedbin attack漏洞
一、核心思想实现在任意地址写一个数值 局限性:通常unsortedbin attack只能够在目标地址写一个大数值 unsortedbin attack通常是为了配合fastbin attack而使用的fastbin attack见文章:https://blog.csdn.net/qq_41453285/article/details/99315504二、原理图解当从unsor...原创 2019-08-13 14:57:50 · 3247 阅读 · 2 评论