前言

很久之前学过一点堆知识,如今再次拾起来发现需要重新再学一遍……

因此在这里写一点自己在学习过程中的想法,以便未来的我看到这里可以快速想起知识

https://www.yuque.com/hxfqg9/bin/ape5up#kcNpL

简单堆结构

使用中的:

基本来说是这个样子:

物理相邻的前堆块的大小 本堆块的大小
用户可以使用的空间开始

注意P位,当它是0的时候标志物理相邻的前一个堆块是被释放的,有时候可以合并

被释放后的:

物理相邻的前堆块的大小 本堆块的大小
fd指针 bk指针
fd_next_chunk指针 bk_previous_chunk指针

fastbin的时候(空间小的堆块回收到的地方),基本只用关注fd指针,fd指针指向前一个释放的堆块(同等大小)

a=malloc(0x10);
b=malloc(0x10);
free(a);
free(b);

这个时候b堆块的fd指针就指向a开始的地方。但是要注意用户开始使用的空间和堆块开始的空间不一样,一般是+0x10。

UAF漏洞

如果free(a)之后没有a=0,那么还能再使用a这个指针。

free(a);
//a=0;
//存在uaf漏洞

简单的double free

libc2.26之后加了tcache,这里讲的是libc2.23版本的

因为free的时候会检查fastbin最上面的是不是和free的相同,相同的话会报错,因此我们可以free(a)之后再free(b)再free(a)。

这时候a b的fd指针就是互相指向的。

free(a);
free(b);
free(a);
d=malloc(8);
e=malloc(8);
f=malloc(8);

这时候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的所有内容了