Heap Exploit

堆積利用筆記

建議先找出各種版本的 glibc source 的檢視器

heap feng shui

前置概念

Calloc()

這個會把記憶體的內容清掉,所以沒辦法用來 leak 東西

幾個重點

malloc_state

我懶得畫圖

反正他們會串再一起

heap info

Libc 是透過 _heap_info 下去紀錄資料,Arena 保存 heap 的狀態

Chunk

Heap 預設透過 mmap 先分配一段大小,滿了之後 glibc 根據大小

boundary tag [knuth]

prev_size 為了增加效率

Size bit 有四個未的 bit

Bin

初始化 bin malloc.c#L1794,可以看到它實際上是 malloc_chunk 的結構,但是 bin_at 每次移動 0x10 所以可以看到類似這樣的記憶體

┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│   fd    │   bk    │   fd    │   bk    │   fd    │   bk    │   fd    │   bk    │
└─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘

在 gdb 下面可以看到 bin->fd = bin->bk = bin,並且 &fd-0x10 可以對應到 chunk 的 prev_size 的位置,初始化的時候 fd 和 bk 都指向自己

0x00007f0000000bf0│+0x0010: 0x000055000000b0d0 
0x00007f0000000bf8│+0x0018: 0x000055000000aae0 
0x00007f0000000c00│+0x0020: 0x00007f0000000bf0 
0x00007f0000000c08│+0x0028: 0x00007f0000000bf0 
0x00007f0000000c10│+0x0030: 0x00007f0000000c00
0x00007f0000000c18│+0x0038: 0x00007f0000000c00
0x00007f0000000c20│+0x0040: 0x00007f0000000c10
0x00007f0000000c28│+0x0048: 0x00007f0000000c10
0x00007f0000000c30│+0x0050: 0x00007f0000000c20

Unsorted Bin

Free 之後一率放到 unsorted bin, 之後才有機會放入 small bin large bin

為了了解 heap 的運作機制,這邊寫了幾個範例可以使用 gdb 進行分析 practice/pwn/allocator

┌───────────────────────────────────────────────────────────────────────────────────────┐
│                                  malloc_state aka arena                               │
│ ┌─────────┬─────────┬─────────┬─────────┐   ┌─────────┬─────────┬─────────┬─────────┐ │
│ │prev_size│  size   │   fd    │   bk    │   │prev_size│  size   │   fd    │   bk    │ │
│ └─────────┴─────────┴───┬─────┴────┬────┘   └─────────┴─────────┴───┬─────┴────┬────┘ │
│  ▲ ▲                    │          │         ▲ ▲                    │          │      │
│  │ │                    │          │         │ │                    │          │      │
└──┼─┼────────────────────┼──────────┼─────────┼─┼────────────────────┼──────────┼──────┘
   │ │                    │          │         │ │                    │          │
   │ │     ┌──────────┐   │          │         │ │     ┌──────────┐   │          │
   │ │ ┌──►│prev_size │◄──┘          │         │ │   ┌►│prev_size │◄──┘          │
   │ │ │   │size      │              │         │ │   │ │size      │              │
   │ │ │   │fd        ├─┐            │         │ │   │ │fd        ├─┐            │
   └─┼─┼───┤bk        │ │            │         └─┼───┼─┤bk        │ │            │
     │ │   │          │ │            │           │   │ │          │ │            │
     │ │   │payload   │ │            │           │   │ │payload   │ │            │
     │ │   │          │ │            │           │   │ │          │ │            │
     │ │   └──────────┘ │            │           │   │ └──────────┘ │            │
     │ │                │            │           │   │              │            │
     │ │   ┌──────────┐ │            │           │   │ ┌──────────┐ │            │
     │ │ ┌►│prev_size │◄┘            │           │   │ │prev_size │◄└────────────┘
     │ │ │ │size      │              │           │   │ │size      │
     │ │ │ │fd        ├─┐            │           └───┼─┤fd        │
     │ └─┼─┤bk        │ │            │               └─┤bk        │
     │   │ │          │ │            │                 │          │
     │   │ │payload   │ │            │                 │payload   │
     │   │ │          │ │            │                 │          │
     │   │ └──────────┘ │            │                 └──────────┘
     │   │              │            │
     │   │ ┌──────────┐ │            │
     │   │ │prev_size │◄└────────────┘
     │   │ │size      │
     └───┼─┤fd        │
         └─┤bk        │
           │          │
           │payload   │
           │          │
           └──────────┘

Small Bin

Large bin

Tools 工具

保護機制

新版(幾版?)的 ptmalloc 要實踐 unlink attack,因為在 Consolidation 會去檢查 fd 與 bk 是否正常,因此繞過這個機制蠻麻煩的。

glibc 2.29 之後 unsorted bin 已經有許多緩解機制,unlink 基本上 glibc 打不太動的了

small bin unlink 會跑到 unsorted bin 然後設定好的 ptr 就會爛掉。

漏洞利用

Use After Free

釋放後,嘗試複寫原始地址,因為原始空間已被空閒了下來了可以重新分配。

習題

參見

CS 241 · Malloc


  1. 參見 針對多執行緒環境設計的 Memory allocator 的 bins 區段,以及 你所不知道的 C 語言:記憶體管理、對齊及硬體特性,對於理解記憶體管理機制很有幫助。 ↩︎

  2. Angel Boy Heap Exploitation 推薦參閱該份簡報 ↩︎ ↩︎


CTF Vulnerability Heap PWN