堆1
前言
很久之前学过一点堆知识,如今再次拾起来发现需要重新再学一遍……
因此在这里写一点自己在学习过程中的想法,以便未来的我看到这里可以快速想起知识
简单堆结构
使用中的:

基本来说是这个样子:
| 物理相邻的前堆块的大小 | 本堆块的大小 |
|---|---|
| 用户可以使用的空间开始 |
注意P位,当它是0的时候标志物理相邻的前一个堆块是被释放的,有时候可以合并
被释放后的:

| 物理相邻的前堆块的大小 | 本堆块的大小 |
|---|---|
| fd指针 | bk指针 |
| fd_next_chunk指针 | bk_previous_chunk指针 |
fastbin的时候(空间小的堆块回收到的地方),基本只用关注fd指针,fd指针指向前一个释放的堆块(同等大小)
a=malloc(0x10); |
这个时候b堆块的fd指针就指向a开始的地方。但是要注意用户开始使用的空间和堆块开始的空间不一样,一般是+0x10。
UAF漏洞
如果free(a)之后没有a=0,那么还能再使用a这个指针。
free(a); |
简单的double free
libc2.26之后加了tcache,这里讲的是libc2.23版本的
因为free的时候会检查fastbin最上面的是不是和free的相同,相同的话会报错,因此我们可以free(a)之后再free(b)再free(a)。
这时候a b的fd指针就是互相指向的。
free(a); |
这时候d和f就是同一个曾经的a指针。
House of spirit
一种针对fastbin的攻击
什么情况下使用?
当有一块区域,这个区域上下两部分你都能控制,但是区域内部无法控制,并且区域内部有重要数据,比如返回地址。
(一般来说,这块区域指的是某个函数栈帧的位置,这个函数的父函数中有局部变量能够控制,这个函数里面还有局部变量你能够控制)
使用house of spirit可以通过控制前后区域来控制整片区域。
使用条件
fake chunk 的 ISMMAP 位不能为 1,因为 free 时,如果是 mmap 的 chunk,会单独处理
fake chunk 地址需要对齐, MALLOC_ALIGN_MASK (0x10!! )
fake chunk 的 size 大小需要满足对应的 fastbin 的需求,同时也得对齐 (size直接写成0xN0即可)
fake chunk 的 next chunk 的大小不能小于 2 * SIZE_SZ (16),同时也不能大于av->system_mem(128kb)
fake chunk 对应的 fastbin 链表头部不能是该 fake chunk,即不能构成 double free 的情况
(64位情况下)
如何使用?
*(fake_chunk_addr+8)=size (当前fake chunk的size 直接0xN0即可)
fake_chunk物理相邻的下一个chunk的size也要设置,16<size<128kb
然后free(fake_chunk)
然后malloc(fake_chunk)
之后就可以控制这个fake_chunk的所有内容了











