hacktricks/binary-exploitation/libc-heap/house-of-force.md

6 KiB
Raw Blame History

强制之屋

{% hint style="success" %} 学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}

基本信息

代码

  • 这种技术已被修补 (这里),并产生以下错误:malloc(): corrupted top size
  • 您可以尝试这里的代码进行测试。

目标

  • 此攻击的目标是能够在特定地址分配一个块。

要求

  • 允许覆盖顶部块头部大小(例如 -1的溢出。
  • 能够控制堆分配的大小。

攻击

如果攻击者想要在地址 P 中分配一个块以覆盖这里的值。他首先通过将顶部块大小覆盖为 -1(可能通过溢出)来开始。这确保了 malloc 不会为任何分配使用 mmap因为顶部块始终有足够的空间。

然后,计算顶部块地址和目标空间之间的距离以进行分配。这是因为将执行具有该大小的 malloc 以将顶部块移动到该位置。这就是差异/大小可以轻松计算的方式:

// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/

因此,分配目标地址 - 旧top地址 - 4*sizeof(long)的大小4个long是因为顶部块的元数据和分配新块时的元数据将把顶部块移动到我们想要覆盖的地址。
然后再次执行malloc以在目标地址获取一个块。

参考资料和其他示例