这位老师说,他讲的只是建设大概的框架,还要再细细的学习,动手实践。那么这个视频的学习就是建立大致框架。
在主进程,malloc state在libc之中,而在副线程则是在arena之中。

不要忘记复习之前的内容,堆的控制结构也是需要烂熟于心的。
需要注意,分配到的堆默认是没有执行权限的。
TOP chunk
保管剩余部分的内存的chunk。

how2heap实验

这个是代码,fpaintf意为在文件描述符地方输出格式化字符串,第一个stderr就是错误区,这部分是没有缓冲区的。
这里说的是操作系统的"第一匹配",什么意思呢?
一般情况下,申请一块堆内存,会先在fast bin看看,如果没有就要去unsort bin遍历,如果还是没有只能进行分类后去small和large bin找,还是没有的话只能去TOP CHUNK,还是没有就得去brk调用,还是不行最后只能借助mmap来搞一块内存映射。
但是,如果申请内存小于某个chunk,空余的内存就会进入unsort chunk了。这部分叫做last_remainder_chunk(最后剩余块)
use after free
这个实验是这样的:
首先申请一块512和256的chunk。因为紧邻256的就是一块free chunk(TOP chunk)假如不申请一个256,后期512内存的chunk会进行free,就会和top chunk合并了

上图是释放了A后,大家注意看接下来的变化:

程序再次申请了0x500的内存,因为直接就找到了释放的0x512,所以这块内存又被利用起来了,标记为C。由于控制字段占的大小是一样,C的指针就再次指向了A所在的这个区域。那么,A和C指针指的实际上是同一片区域,自然打印的内容也是一样。
再次设计一下,假如A指向的是重要控制信息,C却可以和A一样操作访问这块区域(因为二者实际上在一个内存处)
相当于一个警察申请了一张搜查令,用完后将他扔了,结果被C捡了起来,并且用了起来。这就相当于是一个use after free。
double_free(fast_bin_dup_into_stack)

显著的特征就是free了两次。

原因在于我们指向a内存的指针没有同时被"free"掉,类似于罪犯的房屋被没收后,房产证没有被没收,导致它还可以以房屋主人的名义操作房子,即便这个房子已经不属于他了。
这样,当我们再次malloc的时候,实际上两次malloc的A返回的指针指向的位置都是同一个地方。
另外注意这个b的作用,高版本的fast bin(至少glibc2.23还没有)已经有连续free地址检查了,就是如果两个a连续被free,它已经可以检测出来了,然后避免这种情况。

申请一块内存。会有漏洞,这里要注意为什么会出现漏洞,d是我们新申请内存的指针,它指向的位置是a没错,但是不要忘记fast bin 还有一个一模一样的a,所以d实际上指向的位置的a,fast bin链表也存了一个,由于链表的chunk会额外多一个fd,d指向的地方是malloced chunk的内存区,和fast bin链表chunk的fd区。在这里假如写入一个栈的地址,就会让fast bin的下一个chunk是一个栈空间。

后期利用需要注意,fd指的是chunk的开头,数据区上面两个字长,malloc后的指针指的位置是数据区。所以真修改的时候需要把栈数据区地址减去2字长给fd。(栈的内存地址布局和堆相反)
tcache
可以理解为super fast bin,速度比fast bin还快。存放到fast bin之前的chunk
(满足一定大小要求的情况下)会优先存在tcache
GLBC2.26、2.27没有fast bin大小检查和连续free检查(大小检查就是进入fast bin的chunk必须满足一定大小要求)2.28又补上了
unsorted bin attack
Unsorted Bin Attack 被利用的前提是控制 Unsorted Bin Chunk 的 bk 指针。
Unsorted Bin Attack 可以达到的效果是实现修改任意地址值为一个较大的数值。
这个漏洞会简单介绍,因为老师有的地方讲错了一点。比如unsorted bin的结构(我看CTF wiki上绘制的图可能比较正宗)

这个结构是先进入先出来。malloc这个区域的chunk之后:

注意这里fd和bk的连接。

我们只要修改一个已存在chunk的bk域,这样就会欺骗unsorted chunk后面还有一个chunk。根据设计原理,这个不存在的chunk需要在fd写入unsorted bin的地址,unsort bin要知道主线程在libc区域,是一个大数字,就会写入到这个chunk的fd了。合理利用bk指针,就能合理设计到写入大数据的fd的位置。实现任意地址数据写入(但是不能控制写入的数据是啥)
这个漏洞本身不可以劫持程序运行流,但是可以配合其他的手段,实现"小马拉大马"效果。比如可以篡改某个控制字段,实现所有大小的chunk都可以进入fast bin。
house of force
前言:house of xxx系列
名字来源于某个安全研究专家,出了一论文,把一些漏洞全部命名为house of xxxx
这系列漏洞利用复杂度较高,一般都是bin漏洞+其他更多漏洞结合起来来运用
这里先搞一个简单一点的house of force。
这个漏洞用到了堆溢出、整数溢出漏洞等。针对的是top chunk。

本身有个chunk,根据堆溢出漏洞,覆盖了prev_size和size,size修改为很大的数字,让系统以为TOP CHUNK是几乎无限大的,避免了mmap的执行。
这时候,malloc可以传输很大的参数了(如果参数是负数就在top chunk下方找)我们首先malloc一个很大的chunk,直接到达栈。然后现在TOP chunk就是栈空间及其以上空间了(假设size足够大)接下来我们再次malloc,相当于这个chunk就是栈空间了。可以自由修改了!
data段在堆这部分下方。可以malloc负数,来修改data段的数据。
但是实际上,根据标准的malloc函数,是不支持负数的,会把负数解析成一个很大的无符号整数。
下图是简单介绍下整数溢出。上面有个大数也来做加法。由于高位计算不过来就舍弃了,剩余的反而成了小的数(只是演示,不要在意结果)

运用到这里,malloc负数,等效于malloc一个很大的地址,应该是由于TOP chunk的size很大,会malloc成功。而且malloc之后,top chunk的地址会重新计算,相当于原地址+malloc的size,可能发生整数溢出,反而到了低地址。
就可以先溢出到data的某个地方,再次向上malloc一个chunk,来篡改data段数据。
gdb的一些使用特性
对于开启了PIE的题目而言,断在确定位置的代码怎么来搞呢?可以用***$rebase(偏移量)**来操作,这也是pwntool里面的功能,普通GDB是没得的。

本地调试的时候,我们可以在exp某个地方执行一个pause,这样脚本会返回一个进程号,我们进入gdb输入attach+进程号,就会进入到exp执行到的地方。继续的话在脚本运行窗口按个按键即可
