mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
3.5 KiB
3.5 KiB
大型 Bin 攻击
从零开始学习 AWS 黑客技术,成为 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想看到您的公司在 HackTricks 中做广告或下载 PDF 版本的 HackTricks,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 探索PEASS 家族,我们的独家NFT收藏品
- 加入 💬 Discord 群组 或 电报群组 或在 Twitter 🐦 @hacktricks_live** 上关注我们**。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
基本信息
有关大型 Bin 的更多信息,请查看此页面:
{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}
您可以在 how2heap - 大型 Bin 攻击 中找到一个很好的示例。
基本上,您可以看到在最新的 glibc(2.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 添加一个比当前 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找到关于这种攻击的另一个很好的解释。