๐Heap 2
Double Free
Challenge
Overview
createHeap()

showHeap()

editHeap()

deleteHeap()

Phรขn tรญch
Do chฦฐฦกng trรฌnh khรดng cรณ bแบฅt kรฌ hร m nร o ฤแป ฤแปc ฤฦฐแปฃc flag nรชn tรดi nghฤฉ sแบฝ sแปญ dแปฅng cรกc gadget ฤแป rce nรณ. Nhฦฐng mร PIE ฤรฃ ฤฦฐแปฃc bแบญt. Vแบญy ta cแบงn bypass PIE bแบฑng cรกch leak ฤแปa chแป nร o ฤรณ hoแบทc leak ฤแปa chแป libc.
Phแบงn kiแบฟn thแปฉc quan trแปng
Nhฦฐng hรฃy รดn lแบกi 1 chรบt kiแบฟn thแปฉc trฦฐแปc khi lร m:
Bแบกn thฦฐแปng thแบฅy cรกc chunks sau khi ฤฦฐแปฃc free sแบฝ ฤฦฐแปฃc ฤแบฉy vร o fastbins? Vรญ dแปฅ nhฦฐ

Vแบญy khi nร o nรณ khรดng ฤฦฐแปฃc ฤแบฉy vร o fastbins? ==> Khi mร nรณ vฦฐแปฃt qua kรญch thฦฐแปc tแปi ฤa cแปงa fastbins (default):
128bytes ==0x80bytes. Unsorted bin lร mแปt danh sรกch liรชn kแบฟt kรฉp lฦฐu trแปฏ cรกc chunks chฦฐa ฤฦฐแปฃc sแบฏp xแบฟp vร cรณ kรญch thฦฐแปc tแปซ0x80ฤแบฟn0x3fffbytes. Sau khi ฤฦฐแปฃc sแบฏp xแบฟp thรฌ chรบng sแบฝ ฤฦฐแปฃc ฤแปi sang Large bins. Nแบฟu khรดng thรฌ Unsorted bins sแบฝ ฤฦฐแปฃc dรนng ฤแป cแบฅp phรกt cho cรกc malloc mแปi.Fastbins: lร 1 danh sรกch cรณ kiแปu dแปฏ liแปu stack --> ฤรณ lร lรฝ do nรณ khรดng chแปฉa ฤแปa chแป sau khi giแบฃi phรณng.
Unsorted bins lร 1 danh sรกch cรณ kiแปu dแปฏ liแปu lร double linked list (tแปฉc lร bao gแปm 2 node vร 1 data)
Small bins lร 1 danh sรกch cรณ kiแปu dแปฏ liแปu lร double linked list (tแปฉc lร bao gแปm 2 node vร 1 data). Chแปฉa cรกc chunk ฤฦฐแปฃc free cรณ kรญch thฦฐแปc tแปซ
0x20-->0x80Vรฌ allocator luรดn ฦฐu tiรชn fastbins. Cรกc chunks sau khi ฤฦฐแปฃc free sแบฝ ฤฦฐแปฃc ฤฦฐa vร o fastbins trฦฐแปc thay vรฌ small bins.

Hรฃy nhแป chรบng vรฌ tรดi thแบฅy rแบฅt quan trแปng
Quay lแบกi vแปi vแบฅn ฤแป chรญnh. Tรดi khai thรกc tแปซ ฤแป bร i thรฌ cรณ 1 hร m show ra dแปฏ liแปu cแปงa chunk ngay cแบฃ khi nรณ ฤรฃ ฤฦฐแปฃc free (chแป lร khรดng biแบฟt show ra gรฌ thรดi :>>) . Hรฃy nhรฌn lแบกi bแปฉc แบฃnh nร y

Ta cรณ 1 ฤแปa chแป trong phแบงn data cแปงa Unsorted bins. Bรขy giแป tรดi sแบฝ sแปญ dแปฅng script sau ฤรขy ฤแป hiแปn thแป ra nรณ:
Vร tรดi thแบฅy nรณ thuแปc vรนng nhแป cแปงa libc:

Oki vแบญy tรดi sแบฝ lแบฅy ra ฤแปa chแป ฤฦฐแปฃc leak vร ฤแปa chแป __malloc_hook luรดn.

Vแบญy lร m sao ฤแป cรณ thแป dรนng ฤแปa chแป nร y?
Thรฌ tiแบฟp theo tรดi sแบฝ sแปญ dแปฅng lแปi double free ฤแป khai thรกc tiแบฟp.
Double free lร 1 kฤฉ thuแบญt mร ta cรณ thแป free cรกc chunk nhiแปu hฦกn 1 lแบงn. Mแปฅc ฤรญch lร ฤiแปu khiแปn con trแป fd. ฤแปc thรชm kฤฉ thuแบญt ฤรณ แป ฤรขy.



Lรฝ do chuyแปn tแปซ Unsortedbins --> Smallbins: Nแบฟu chunk cรณ kรญch thฦฐแปc lแปn hฦกn kรญch thฦฐแปc tแปi thiแปu cแปงa small bin (trong phiรชn bแบฃn libc 2.33, kรญch thฦฐแปc tแปi thiแปu cแปงa small bin lร 0x20 bytes), thรฌ chunk sแบฝ ฤฦฐแปฃc chuyแปn sang small bin ngay sau ฤรณ.


Oke, vแบญy ta ฤรฃ free chunk 2 lแบงn.
Tiแบฟp sau ฤรณ, tรดi cแบฅp phรกt 1 chunk ฤแป xuแบฅt hiแปn malloc_hook trong fastbin ฤแป sau nร y chรบng ta ghi ฤรจ:

Xem ฤoแบกn data mร tรดi ฤรฃ write vร o chunk:

Vแบญy tแบกi sao tรดi lแบกi lแบฅy ฤแปa chแป malloc_hook - 35 mร khรดng phแบฃi lร ฤแปa chแป cแปงa malloc_hook luรดn? Trแบฃ lแปi:
Tรดi sแบฝ thแปญ gแปญi payload:

Nguyรชn do lร trong cรกi chunk nร y khรดng chแปฉa size.

Dแบซn ฤแบฟn lแปi xแบฃy ra. Cรฒn ฤแปi vแปi ฤแปa chแป malloc_hook - 35

Kแบฟt thรบc cรขu hแปi.

Nhฦฐng bรขy giแป fastbins cรฒn chแปฉa 2 chunk ฤang ฤฦฐแปฃc free. Bแปi vแบญy tรดi sแบฝ malloc lแบกi 2 lแบงn nแปฏa ฤแป nรณ trแป ฤแบฟn phแบงn data mร tรดi muแปn ghi ฤรจ.

Vแบญy ta cรฒn 1 bins duy nhแบฅt แป fastbins. Lแบงn nร y ta sแบฝ cแบฅp phรกt 1 lแบงn nแปฏa kรจm data cแปงa one_gadget ฤแป nรณ ฤฦฐแปฃc ghi ฤรจ vร o malloc_hook.
Nhฦฐng sau ฤรณ tรดi ฤรฃ gแบทp lแปi nhฦฐ nร y:

Tรดi ฤoรกn lร do size mร tรดi ฤรฃ cแบฅp phรกt cho tแปซng chunks vแบญy nรชn tรดi sแบฝ chแปnh 1 xรญu ฤแป sแปญa lแปi nร y.



Khi nร y, nแบฟu bแบกn double free 2 lแบงn liรชn tiแบฟp nแปฏa thรฌ bแบกn sแบฝ gแบทp phแบฃi cรกc lแปi nhฦฐ "double free", "heap corruption" hoแบทc "use after free", thรฌ __malloc_hook cรณ thแป ฤฦฐแปฃc gแปi ฤแป xแปญ lรฝ cรกc vแบฅn ฤแป ฤรณ. Vรฌ vแบญy khi malloc hook ฤฦฐแปฃc gแปi, ฤแปa chแป mร tรดi ghi ฤรจ cลฉng ฤฦฐแปฃc gแปi vร ta lแบฅy ฤฦฐแปฃc shell.
Cuแปi cรนng, ฤรขy lร tแบฅt cแบฃ payload cแปงa tรดi.

Tแปng kแบฟt
Qua bร i nร y, tรดi nghฤฉ bแบกn sแบฝ hiแปu hฦกn vแป cรกch tแบญn dแปฅng lแปi Double Free + __Malloc_hook() + one_gadget ฤแป khai thรกc cลฉng nhฦฐ ghi ฤรจ lรชn cรกc ฤแปa chแป mong muแปn nhแบฑm mแปฅc ฤรญch khai thรกc HEAP.
Vร mแปt vร i kiแบฟn thแปฉc vแป fastbins, small bins vร unsorted bins.
pwndbg
Cรกch tรฌm cรกc hร m nhฦฐ
__malloc_hook:
Vร dแปฏ liแปu trong ฤแปa chแป cแปงa __malloc_hook sแบฝ lร hร m malloc_hook_init. Hร m malloc_hook_init ฤฦฐแปฃc gแปi khi chฦฐฦกng trรฌnh bแบฏt ฤแบงu chแบกy vร nรณ cรณ tรกc dแปฅng khแปi tแบกo bแป hook ฤแป theo dรตi cรกc lแปi gแปi hร m malloc. Khi chฦฐฦกng trรฌnh thแปฑc hiแปn lแปi gแปi hร m malloc, cรกc bแป hook nร y sแบฝ ฤฦฐแปฃc kรญch hoแบกt vร cho phรฉp chฦฐฦกng trรฌnh can thiแปp vร o quรก trรฌnh cแบฅp phรกt bแป nhแป ฤแปng.

Lแปi malloc(): memory corruption (fast)
ฤoแบกn code nร y sแบฝ kiแปm tra Fastbins xem cรณ thแปa mรฃn hay khรดng

Oke, Hiแปu sฦฐฦกng sฦฐฦกng cรณ vแบญy, Nhแป ฤฦฐแปฃc tแบฅt cแบฃ chรบng thรฌ quแบฃ lร 1 ฤiแปu tuyแปt vแปi rแปi.
Last updated
