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的博客!