๐Heap 2
Double Free
Last updated
Double Free
Last updated
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): 128
bytes == 0x80
bytes. 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
ฤแบฟn 0x3fff
bytes. 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
--> 0x80
Vรฌ 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:
Mแปt chรบt kiแบฟn thแปฉc mแปi แป ฤรขy:
__malloc_hook
lร mแปt tรญnh nฤng trong C. The Offical GNU site ฤแปnh nghฤฉa __malloc_hook
nhฦฐ sau:
Giรก trแป cแปงa biแบฟn nร y lร mแปt con trแป ฤแบฟn hร m mร malloc sแปญ dแปฅng bแบฅt cแปฉ khi nร o nรณ ฤฦฐแปฃc gแปi
Tรณm lแบกi, khi gแปi malloc()
--> con trแป function __malloc_hook
cลฉng ฤฦฐแปฃc gแปi --> cรณ thแป overwrite vร o ฤแปa chแป cแปงa __malloc_hook
. Giแบฃ sแปญ mแปt one_gadget
vร bแบฑng cรกch nร o ฤรณ kรญch hoแบกt mแปt cuแปc gแปi ฤแบฟnmalloc()
,
chรบng ta cรณ thแป cรณ ฤฦฐแปฃc mแปt shell dแป
dร ng.
Oki vแบญy tรดi sแบฝ lแบฅy ra ฤแปa chแป ฤฦฐแปฃc leak vร ฤแปa chแป __malloc_hook
luรดn.
Thรฌ tiแบฟp theo tรดi sแบฝ sแปญ dแปฅng lแปi double free ฤแป khai thรกc tiแบฟp.
Sau khi malloc thรฌ Unsorted bins ฤฦฐแปฃc chuyแปn xuแปng dฦฐแปi. Tแปฉc lร nรณ dร nh ra 0x60 bytes cho con trแป vแปซa ฤฦฐแปฃc cแบฅp phรกt. Vร cรฒn lแบกi 0x20 bytes nhฦฐ แบฃnh bรชn dฦฐแปi, phแบงn data cลฉng bแป thay ฤแปi luรดn.
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.
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.
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.
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 ฤรณ .