hacktricks/binary-exploitation/libc-heap/large-bin-attack.md

4.9 KiB
Raw Permalink Blame History

大型 Bin 攻击

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

支持 HackTricks
{% endhint %}

基本信息

有关什么是大型 Bin请查看此页面

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

可以在how2heap - 大型 Bin 攻击中找到一个很好的示例。

基本上,您可以看到在最新的 glibc2.35)版本中,未检查:P->bk_nextsize,允许在满足某些条件的情况下修改任意地址的值为大型 Bin 块。

在该示例中,您可以找到以下条件:

  • 分配了一个大块
  • 分配了一个比第一个小但在相同索引中的大块
  • 必须更小,因此在 Bin 中必须首先进入
  • (创建一个块以防止与顶部块合并)
  • 然后,释放第一个大块并分配一个比它更大的新块 -> Chunk1 进入大型 Bin
  • 然后,释放第二个大块
  • 现在,漏洞:攻击者可以修改 chunk1->bk_nextsize[target-0x20]
  • 然后,分配比块 2 更大的块,因此块 2 被插入大型 Bin覆盖地址 chunk1->bk_nextsize->fd_nextsize 为块 2 的地址

{% hint style="success" %} 还有其他潜在情景,关键是向大型 Bin 添加一个比当前 Bin 中的 X 块更小的块,因此需要将其插入到 Bin 中的 X 块之前,并且我们需要能够修改 X 的 bk_nextsize,因为这是较小块的地址将被写入的位置。 {% endhint %}

这是来自 malloc 的相关代码。已添加注释以更好地理解地址是如何被覆写的:

{% code overflow="wrap" %}

/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
{
fwd = bck; // fwd = p1
bck = bck->bk; // bck = p1->bk

victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}

{% endcode %}

这可以用来覆盖libc的global_max_fast全局变量然后利用更大的块进行快速bin攻击。

您可以在guyinatuxedo中找到关于这种攻击的另一个很好的解释。

其他示例

{% hint style="success" %} 学习并练习AWS HackingHackTricks Training AWS Red Team Expert (ARTE)
学习并练习GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

支持HackTricks
{% endhint %}