PWN研究締結(8) - ヒープ(継続的に更新)
序文
学習「のglibcメモリ管理ptmallocソースコード解析、」荘Mingjiang
インターネットからセクション参照情報
チャンク
説明:
- ユーザーの場合はmallocのスペースのためのアイソクロナス機能は、実際には、ヒープからメモリを割り当てます
- 現在使用して、標準のLinuxディストリビューションのglibcのヒープアロケータを:ptmalloc2
- ptmallocユーザーのニーズに応じて、ユーザーはチャンクの種類を割り当てられています
構造:
struct malloc_chunk {
INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
struct malloc_chunk* fd; /* double links -- used only if free. */
struct malloc_chunk* bk;
/* Only used for large blocks: pointer to next larger size. */
struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
struct malloc_chunk* bk_nextsize;
};
(分配後)使用
chunk start
:チャンク開始アドレス
previous size
:
- チャンクのサイズ、32は4つのバイトを占有し、8つのバイト64を占め
- 場合にのみ、最後のチャンクはアイドル状態にある場合に有効
size
:
- チャンクの現在のサイズ、32は4つのバイトを占有し、8つのバイト64を占め
- 3ビットがされた後にM | | A Pのフラグ、それぞれが別の意味を表す
A
:0チャンクが属することを示す主分布領域 1のチャンクに属することを示す非プライマリ分布ゾーン
M
:現在のチャンクがメモリ領域から得られていることを示しています仮想メモリ。1チャンクがからであることを示しているMMAPアロケーション・マップ領域、またはからヒープ割り当てられた領域
P
:チャンク1として使用される前に、現在のチャンクが無効prev_sizeが前のチャンク上の任意の操作を行うことはない表します。の不存在を基準にプログラムエリアを防止するために常に1に設定された第1のPヒープ、
memory
:ユーザーのにmalloc関数などのバックチャンクデータ領域ポインタ
アイドル(リリース後)
説明:
- Mが存在しない空きチャンク、唯一のA | P状態
- ユーザデータは2人のヘッドのメンバー、FDとBKが割り当てられ、
fd
:ポイントは、フリーチャンクの前に、開始アドレス、32ビットは4バイト、64バイト8を占有
bk
:小数点フリーチャンクの後の開始アドレスは、32バイト4を占め、64は8つのバイトを占有します
注:実際には、のリリース後に大きなブロック、二つの他のメンバーが残っています:fd_nextsizeとbk_nextsize、その後の再導入のために
ヒープブロックサイズ
32ビットオペレーティングシステム:
- 最小ヒープブロックサイズにユーザを割り当てる
17B
:prev_size(4B)+ サイズ(4B)+ FD(4B)+ BK(4B)+ next_chunk-> P(IB) - ユーザ要求のサイズは、最小サイズのスタックを超え、そしてれる場合8B整列します
64ビットオペレーティングシステム:
- 最小ヒープブロックサイズにユーザを割り当てる
33B
:prev_size(8B)+ サイズ(8B)+ FD(8B)+ BK(8B)+ next_chunk-> P(IB) - ユーザ要求のサイズは、最小サイズのスタックを超え、そしてれる場合16Bは整列します
空間多重化
説明:チャンクは、使用中のprev_size無効のその次のチャンクです。現在のチャンクprev_sizeの次のチャンクを使用することもできるので、空間多重のチャンクはあります
ビン
説明:
- ユーザー空きメモリがアウトシステムのすぐに返されますされていない、ptmallocは、統合管理とmmapマッピングされたエリアの無料チャンクをヒープます
- ユーザーの下で割り当て要求、ptmallocは、最初のオーバーヘッドのメモリ割り当てを減らすこと、あなたが頻繁にシステムコールを避けるように、ユーザーに無料のチャンクを選択しようとするとき
- チャンクサイズptmalloc同様の双方向リストをリンクされた、そのようなリストは、ビンと呼ばれ
- ptmalloc 128ビンの合計を維持し、ビンを格納する配列を使用します
- :特性ヒープマネージャーによると、4つのスタックに分割されますfastbin | unsortedbin | smallbin | largebin
- アレイのビンにビン1未分類、小〜63ビンのビン2、ビン大ビン64〜126
fastbin
説明:
- 32ビットオペレーティングシステムでは、ユーザがリリースヒープブロックサイズは以下64Bがよりチャンクバイト80の、すなわち最大の空間、fastbin管理を使用します
- fastbin使用のみFD単独リンクリスト構造体のメンバ
- fastbinないでPビットがマージするためのイニシアチブを取るないことを意味操作、;特定の状況でのみ、ヒープマネージャはfastbinにマージします
- fastbinYエンドノードが割り当てられている場合、前のノードへのポインタ、FDそれを通して、現在のノードにリンクされたリストをfastbinアレイ、異なるサイズの各メンバー個別に管理fastbinリスト、およびエンドポイントを管理します
- ユーザは、より小さいまたは等しいチャンクサイズ当てはまる場合MAX_FAST_SIZE、対応するフリーブロックから最初の検索fastbins、ルールLIFO(最後に、最初に、LIFO)を
アイデアを使用します
- 申请2个fastbin堆块:chunk1和chunk2
- 依次释放chunk2和chunk1
- 重新申请一个fastbin堆块,将会分配到chunk1(后释放的先分配)
- 对chunk1进行写入,溢出并覆盖chunk2的fd区域
- 再申请一个堆块,将分配到chunk2,由于chunk2->fd不为0,堆管理器中的空闲chunk指针指向chunk2->fd
- 第三次申请堆块时,将会分配到chunk2->fd处
unsorted bin
描述:
- 当释放较小或较大的chunk的时候,为了增加分配效率,系统会先将最近释放的chunk添加到unsorted bin中
- unsorted bin 为一个双向循环链表,对chunk的大小没有限制,即任何大小的chunk都可以放入unsorted bin链表中
small bin
描述:
- 在32位操作系统中,当用户释放的堆块大小大于64B,小于等于512B时使用small bin进行管理
- small bin 为双向循环链表,且使用 FIFO(First in, first out, 先入先出) 算法
- 当满足small bin条件的chunk被释放后,会优先被放入unosrted bin,只有在一定情况下,才会被分配到small bin中
- 隣接する空きチャンクは、より大きな報酬チャンク、増加メモリ使用率にマージされます