pwn之堆入門

2021-10-23 05:10:17 字數 1950 閱讀 8007

在程式執行的過程中,由malloc申請的記憶體空間被稱作chunk,而當程式申請的chunk被free時會被加入到相應的空閒管理列表(bin)中。

解釋:前乙個chunk塊的大小,如果chunk_size的p位為1則pre_size無效,上個chunk可以使用pre_size的空間。(前乙個chunk塊的大小,指的是低位址的chunk)

當前chunk的大小,由於chunk是8位元組對齊的,所以後3位分別為,a(是否為main_arena,即主線程)、m(該chunk是否由mmap分配),p(前乙個chunk是否被分配,故經常會看到chunk_size比chunk大1位元組)。

使用者申請的空間,即malloc 申請得到的記憶體指標,其實指向 mem 的起始處。chunk 處於分配狀態時,從 fd 字段開始是使用者的資料。chunk 空閒時,會被新增到對應的空閒管理鍊錶中,其字段的含義如下

fd 指向下乙個(非物理相鄰)空閒的 chunk

bk 指向上乙個(非物理相鄰)空閒的 chunk

通過 fd 和 bk 可以將空閒的 chunk 塊加入到空閒的 chunk 塊鍊錶進行統一管理

chunk的大小必須是 2 * size_sz 的整數倍。如果申請的記憶體大小不是

2 * size_sz 的整數倍,會被轉換滿足大小的最小的 2 * size_sz 的倍數。size_sz 是 4;64 位系統中,size_sz 是 8。

故在32位中最小的chunk(min_size)的大小為:8+4+4=16位元組,其中8位元組為使用者使用的空間,4位元組為pre_size,4位元組為chunk_size

64位為:16+8+8=32字,16位元組為使用者使用的空間,8位元組為pre_size,8位元組為chunk_size(最小的chunk意味著只要使用者申請的size小於min_size,得到的空間都為min_size)

使用者釋放掉的 chunk 不會馬上歸還給系統,ptmalloc會統一管理 heap 和 mmap 對映區域中的空閒的chunk。在具體的實現中,ptmalloc 採用分箱式方法對空閒的chunk 進行管理。首先,它會根據空閒的 chunk 的大小以及使用狀態將 chunk 初步分為4類:fast bins,small bins,large bins,unsorted bin。每類中仍然有更細的劃分,相似大小的 chunk 會用雙向鍊錶鏈結起來。也就是說,在每類 bin 的內部仍然會有多個互不相關的鍊錶來儲存不同大小的chunk。在這裡我們主要學習的兩種bin:fastbins和unsorted bin。

glibc以單鏈表結構對其進行管理,且每個bin採取的是lifo(後進先出,跟棧類似)的策略,即最近釋放的chunk會被優先分配,同時fastbin中的chunk的p位設為1,不會進行合併操作。

fastbin大小(注:以下的大小都為mem的大小,實際chunk的空間還要加上chunk_head(64位為16位元組,32位為8位元組))

fastbins中最多有10個bin:

如果free的chunk塊不在fastbins範圍內,就會被亂序存放在unsorted bins內,即是未排序的bin,而unsortedbins的作用是視作空閒 chunk 回歸其所屬(larg/small) bin 之前的緩衝區。當使用者申請(malloc)乙個大於fastbin的chunk時,首先會遍歷unsorted bin中的chunk,找到合適的chunk,這時再將其他不滿足的chunk儲存到small bin和large bin中也是順便的事情,所以從unsorted bin命名也可看成,這是乙個未排序的bin,需要排序就需要遍歷,遍歷後的chunk就直接分類到(larg/small)bin中。

unsortedbin在使用過程中採用的遍歷順序是fifo,同時bin中的chunk是以雙向鍊錶連線的,fd指向先入bin的chunk,bk指向**bin的chunk

POJ 2010 二叉堆 入門)

好像這題二分也可以做 話說這年頭寫堆都不用heapify 函式的?program p2010 const maxc 100000 maxn 19999 maxaid 100000 maxf 2000000000 type node record a,b longint end heap record...

PWN入門之簡析延遲繫結技術

對於延遲繫結技術還是不太了解適宜看一下這篇文章 延遲繫結繫結技術就是linux下elf程式在呼叫函式時動態鏈結的方式。為了優化記憶體,加快執行速度等等原因,elf程式運用了這樣的技術來呼叫函式。簡單的說就是程式在呼叫函式時先jmp fun plt 進入plt表。接著jmp fun got,這時候的g...

CTF競賽入門(八)pwn

pwn po n pu n p o n p n pi o n pw n o n 是乙個駭客語法的俚語詞,自 own 這個字引申出來的,這個詞的含意在於,玩家在整個遊戲對戰中處在勝利的優勢,或是說明競爭對手處在完全慘敗的情形下,這個詞習慣上在網路遊戲文化主要用於嘲笑競爭對手在整個遊戲對戰中已經完全被擊...