PWN堆house of spirit-2
-
熟悉了解
tcache_bin的运行过程之后就可以开始学习house of spirit在tcachebin中的利用进行学习了 -
之前以及介绍过了
house of spirit在fastbin中的利用,知道了house of spirit就是通过伪造堆块,将这个伪造的堆块通过free函数,链接到fastbin中。而本篇文章所介绍的是使用house of spirit将伪造的堆块链在tcachebin中。
利用方式
-
在
glibc2.27中比较之前的版本,在free()一个堆块后,如果该堆块放入的是tcache中,是没有做一些检查的。这时就可以对通过伪造一个堆块。然后修改free(p)中的指针p,使得指针p指向的是我们伪造的堆块地址。 -
这样我们就可以将伪造的堆块放入
tcache_bin中,当我们下次使用malloc()函数申请适当的内存空间时,这个堆块就会被我们申请回来。这样我们就可以进行我们伪造的堆块,这一内存空间进行任意的写。如果是在栈上伪造堆块的话, -
常见的伪造区域就是:在
栈上伪造、.bss段上伪造堆块、在malloc_hook的位置伪造堆块 -
利用过程如图所示:

- 伪造了一个
fake_chunk,此时我们可以通过溢出或者写入,可以修改free(ptr)这个ptr的指针,使其指向我们伪造的堆块fake_chunk

- 之后我们调用
free(ptr),这样我们的fake_chunk就可以被放入tcache_bin,放入后的tcache_bin的结构图如下:

- 下次调用
malloc函数时,申请适当大小的堆块,就可以将fake_chunk给申请回来,就可以向fake_chunk中写入数据。

伪造条件
- 对
prev_size位的大小是任意的,因为prev_size要有效,就要size中的p位为0,这样才使得prev_size位有效,而在tcache_bin中是不关心size中的p位。 - 对于
size位和size位中的三个标志位:- 对于
size位,这个需要将该位的范围修改在0x20到0x410直接,这个size位必须与0x10对齐,size位一定要是我们下次能使用malloc申请的大小。 - 对与
P位,tcache_chunk会忽略该位,此时该位可以0也可以1。 - 对于
M位和N位(第2、第3标志位),这两个标志位一定要伪造成0
- 对于
- 对于
prev_size的起始地址,要满足0x10对齐。

实验
- 该实验代码是来自
how2heap中glibc2.27的tcache_house_of_spirit.c
源码
1 |
|
- 接下来翻译一下这段代码,顺便审一下代码。
1 |
|
- 在
ubuntu18.04中glibc2.27版本,使用gcc编译该程序,对该程序进行动态调试。 - 直接使用
ni将程序执行到free(a)这边(free(a)还没有执行完),在执行free(a)之前,我们先使用heap查看堆块,再使用tcachebin查看tcachebin中管理的空闲堆块,并且使用stack命令查看栈上伪造的chunk。



- 栈上伪造的chunk位置和内容如下:


- 之后执行
free(a),再使用tcachebin查看tcachebin管理的空闲链表。

- 再使用
heap命令,看到如下堆块内容。

- 这时我们再执行完
malloc,查看tcachebin和heap

tcachebin_spirit_level_1
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!

