日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

pwn學(xué)習(xí)總結(jié)(四)—— 堆基礎(chǔ)知識(持續(xù)更新)

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

前言

學(xué)習(xí)自《glibc內(nèi)存管理ptmalloc源代碼分析》莊明強(qiáng) 著
部分資料參考自互聯(lián)網(wǎng)

chunk

描述

  • 當(dāng)用戶通過malloc等函數(shù)申請空間時,實(shí)際上是從堆中分配內(nèi)存
  • 目前 Linux 標(biāo)準(zhǔn)發(fā)行版中使用的是 glibc 中的堆分配器ptmalloc2
  • ptmalloc根據(jù)用戶的需要,為用戶分配不同類型的chunk
  • 結(jié)構(gòu)體

    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字節(jié),64位占8字節(jié)
  • 只有當(dāng)上一個chunk處于空閑狀態(tài)時才有效
  • size:

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

    空閑中(釋放后)

    描述

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

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

    堆塊大小

    32位程序

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

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

    描述當(dāng)一個 chunk 處于使用狀態(tài)時,它的下一個 chunk 的 prev_size 無效。所以下一個 chunk 的 prev_size 也可以被當(dāng)前 chunk 使用,這就是 chunk 的空間復(fù)用

    bins

    描述

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

    描述

  • 在32位操作系統(tǒng)中,當(dāng)用戶釋放的堆塊大小小于64B時使用fastbin進(jìn)行管理,即chunk空間最大為80字節(jié)
  • fastbin只使用了fd成員,是個單鏈表結(jié)構(gòu)
  • fastbin不會對P位進(jìn)行操作,也就是說它不會主動進(jìn)行合并;只有在某些特定情況下,堆管理器才會對fastbin進(jìn)行合并
  • fastbinY為管理fastbin的數(shù)組,每個成員分別管理不同大小的fastbin鏈表,且均指向了當(dāng)前鏈表的尾節(jié)點(diǎn),當(dāng)尾節(jié)點(diǎn)被分配時,通過其fd指針指向前一個結(jié)點(diǎn)
  • 當(dāng)用戶申請chunk大小小于或等于MAX_FAST_SIZE時,優(yōu)先從fastbins中查找相應(yīng)的空閑塊,且規(guī)則為LIFO(Last in, first out, 后進(jìn)先出)
  • unsorted bin

    描述

  • 當(dāng)釋放較小或較大的chunk的時候,為了增加分配效率,系統(tǒng)會先將最近釋放的chunk添加到unsorted bin中
  • unsorted bin 為一個雙向循環(huán)鏈表,對chunk的大小沒有限制,即任何大小的chunk都可以放入unsorted bin鏈表中
  • small bin

    描述

  • 在32位操作系統(tǒng)中,當(dāng)用戶釋放的堆塊大小大于64B,小于等于512B時使用small bin進(jìn)行管理
  • small bin 為雙向循環(huán)鏈表,且使用 FIFO(First in, first out, 先入先出) 算法
  • 當(dāng)滿足small bin條件的chunk被釋放后,會優(yōu)先被放入unosrted bin,只有在一定情況下,才會被分配到small bin中
  • 相鄰的free chunk將會被合并成一個更大的fee chunk,增加內(nèi)存利用率
  • 總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。