日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

pwn学习总结(四)—— 堆基础知识(持续更新)

發布時間:2025/3/21 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pwn学习总结(四)—— 堆基础知识(持续更新) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

pwn學習總結(四)—— 堆基礎知識(持續更新)

    • 前言
    • chunk
      • 使用中(分配后)
      • 空閑中(釋放后)
      • 堆塊大小
      • 空間復用
    • bins
      • fastbin
      • unsorted bin
      • small bin

前言

學習自《glibc內存管理ptmalloc源代碼分析》莊明強 著
部分資料參考自互聯網

chunk

描述

  • 當用戶通過malloc等函數申請空間時,實際上是從堆中分配內存
  • 目前 Linux 標準發行版中使用的是 glibc 中的堆分配器ptmalloc2
  • ptmalloc根據用戶的需要,為用戶分配不同類型的chunk
  • 結構體

    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:chunk的起始地址
    previous size:

  • 上一個chunk的大小,32位占4字節,64位占8字節
  • 只有當上一個chunk處于空閑狀態時才有效
  • size:

  • 當前chunk的大小,32位占4字節,64位占8字節
  • 后三個比特位為A|M|P標志位,分別代表不同含義
    A:為0表示該chunk屬于主分配區,為1表示該chunk屬于非主分配區
    M:表示當前chunk是從哪個內存區域獲得的虛擬內存。為1表示該chunk是從mmap映射區域分配的,否則是從heap區域分配的
    P:為1表示前一個chunk正在使用中,當前chunk的prev_size無效,不能對前一個chunk進行任何操作。第一塊heap總是將P設為1,以防止程序引用到不存在的區域
  • memory:malloc等函數返回給用戶的chunk數據區指針

    空閑中(釋放后)

    描述

  • 空閑中的chunk不存在M狀態,只有A|P狀態
  • user data頭部被分配出兩個成員,fd和bk
  • fd:指向前一個空閑chunk的起始地址,32位占4字節,64位占8字節
    bk:指向后一個空閑chunk的起始地址,32位占4字節,64位占8字節

    注意:事實上,釋放后的large block中還存在另外兩個成員:fd_nextsizebk_nextsize,后續再作介紹

    堆塊大小

    32位程序

  • 用戶分配到的最小堆塊大小為17B:prev_size(4B) + size(4B) + fd(4B) + bk(4B) + next_chunk->p(1B)
  • 若用戶申請的大小超過最小堆塊大小,會與8B進行對齊
  • 64位程序

  • 用戶分配到的最小堆塊大小為33B:prev_size(8B) + size(8B) + fd(8B) + bk(8B) + next_chunk->p(1B)
  • 若用戶申請的大小超過最小堆塊大小,會與16B進行對齊
  • 空間復用

    描述當一個 chunk 處于使用狀態時,它的下一個 chunk 的 prev_size 無效。所以下一個 chunk 的 prev_size 也可以被當前 chunk 使用,這就是 chunk 的空間復用

    bins

    描述

  • 用戶free掉的內存并不是都會馬上歸還給系統,ptmalloc會統一管理heap和mmap映射區域中的空閑的chunk
  • 當用戶進行下一次分配請求時,ptmalloc會首先試圖在空閑的chunk中挑選一塊給用戶,這樣就避免了頻繁的系統調用,降低了內存分配的開銷
  • ptmalloc將相似大小的chunk用雙向鏈表鏈接起來,這樣的一個鏈表被稱為一個bin
  • ptmalloc一共維護了128個bin,并使用一個數組來存儲這些bin
  • 堆管理器根據特點,將堆分為四種:fastbin | unsortedbin | smallbin | largebin
  • 數組中bin 1為unsorted binbin 2到63為small binbin 64到126為large bin
  • fastbin

    描述

  • 在32位操作系統中,當用戶釋放的堆塊大小小于64B時使用fastbin進行管理,即chunk空間最大為80字節
  • fastbin只使用了fd成員,是個單鏈表結構
  • fastbin不會對P位進行操作,也就是說它不會主動進行合并;只有在某些特定情況下,堆管理器才會對fastbin進行合并
  • fastbinY為管理fastbin的數組,每個成員分別管理不同大小的fastbin鏈表,且均指向了當前鏈表的尾節點,當尾節點被分配時,通過其fd指針指向前一個結點
  • 當用戶申請chunk大小小于或等于MAX_FAST_SIZE時,優先從fastbins中查找相應的空閑塊,且規則為LIFO(Last in, first out, 后進先出)
  • 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中
  • 相鄰的free chunk將會被合并成一個更大的fee chunk,增加內存利用率
  • 總結

    以上是生活随笔為你收集整理的pwn学习总结(四)—— 堆基础知识(持续更新)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。