House of Einherjar
基本信息
代码
目标
目标是在几乎任意特定地址上分配内存。
要求
当我们想要分配一个块时,创建一个伪造的块:
设置指针指向自身以绕过完整性检查
通过一个块到下一个块的一个字节溢出,使用空字节修改
PREV_INUSE
标志。在被滥用的块的
prev_size
中指示自身与伪造块之间的差异伪造块的大小也必须设置为相同大小以绕过完整性检查
为构造这些块,您将需要一个堆泄漏。
攻击
攻击者在一个受攻击者控制的块内创建一个伪造块,用
fd
和bk
指向原始块以绕过保护分配2个其他块(
B
和C
)在
B
中滥用prev in use
,清除prev_size
数据,并用C
块分配的位置与之前生成的伪造A
块之间的差异进行覆盖这个
prev_size
和伪造块A
中的大小必须相同以绕过检查。然后,填充tcache
然后,释放
C
,使其与伪造块A
合并然后,创建一个新块
D
,它将从伪造A
块开始,覆盖B
块Einherjar之屋到此结束
这可以继续进行快速bin攻击或Tcache污染:
释放
B
以将其添加到快速bin / Tcache覆盖
B
的fd
,使其指向目标地址,滥用包含B
的D
块(因为它包含B
)然后,进行2次malloc,第二次将分配目标地址
参考和其他示例
在释放指针后,它们没有被置空,因此仍然可以访问它们的数据。因此,在未排序的bin中放置一个块,并泄漏它包含的指针(libc泄漏),然后在未排序的bin中放置一个新堆,并从它获得的指针泄漏一个堆地址。
strtok
中的空字节溢出漏洞。使用Einherjar之屋获得重叠块情况,并最终通过Tcache污染获得任意写入原语。
Last updated