iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Security

Pwn2Noooo! 執行即 Crash 的 PWNer 養成遊戲系列 第 26

[Day26] Heap 攻擊 - Unlink Exploit

  • 分享至 

  • xImage
  •  

今天的文章將介紹一種早期常見的攻擊手法——Unlink Exploit,這是一種利用 Heap 中 fd 和 bk 指標漏洞進行的攻擊技術。

Unlink

當程式執行 free 釋放記憶體時,釋放的 chunk 會被標記為空閒,並被加入到 bin 中,以便稍後再次分配或合併。當需要從 bin 中移除 chunk 時,會修改 Double-linked list 中的前後指標(fd 和 bk),將相鄰的兩個空閒區塊合併,此為 Unlink 的過程

Unlink Exploit

以一個 chunk P 為例,它的 fd 和 bk 指標分別指向前一個和後一個空閒 chunk。Unlink 的操作如下:

  • 將 P->fd->bk 設定為 P->bk。
  • 將 P->bk->fd 設定為 P->fd。
    此目的是將 P 從鏈結中移除,同時保持前後 chunk 的連接。

攻擊者可以利用此操作,實現任意記憶體寫入。首先先找到一個可以控制的 chunk,並修改其內部指標。接下來,構造一個偽造的 chunk,並將其 fd 和 bk 指向特定的記憶體位置。

以下為 chunk 在執行 unlink 之前與之後的變化。

釋放前:

chunk1 (fd) -> chunk2 -> next_chunk
    |            |           |
    v            v           v
NULL  <-- (bk)  <--  (bk)  <--

chunk1 和 chunk2 是連接在雙向鏈結中的兩個空閒 chunk。在此鏈結中,chunk1 的 fd 指向 chunk2,而 chunk2 的 bk 則指向 chunk1。

釋放後:

chunk1  ->  chunk1 - 3
    |            |
    v            v
NULL  <--  (bk) <-- 

在 unlink 執行後,系統會更新 fd 和 bk 指標,使得 chunk2 被移除鏈結,並將 chunk1 的指標更新為 chunk1 - 3。攻擊者可利用此過程修改 heap 中的資料。

相關防護

為了避免 Unlink 的操作被攻擊,現在都會有基本的防護機制,如下:

  • Corrupted size vs. prev_size:檢查 chunk 的大小是否正確,以確保相鄰關係未被破壞。
  • Corrupted double-linked list:檢查 fd->bk 和 bk->fd 是否正確,防止攻擊。

上一篇
[Day25] Heap 攻擊 - Forging Chunk
下一篇
[Day 27] Heap 攻擊 - Shrinking Free Chunks
系列文
Pwn2Noooo! 執行即 Crash 的 PWNer 養成遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言