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ฦฐ
Fastbins sแบฝ xรณa 8 bytes bแป nhแป ฤแบงu tiรชn vร giแปฏ lแบกi 8 bytes ฤแบฑng sau. Nรณ khรดng lฦฐu cรกc giรก trแป con trแป mร bแบกn hay thแบฅy แป bร i trฦฐแปc 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.
แบขnh minh hแปa vแป 2 chunk ฤรณ 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
Vรฌ nรณ khรดng bแบฏt ฤแบงu bแบฏt bytes null nรชn sแบฝ data cแปงa chunk sแบฝ ฤฦฐแปฃc ฤแปc ra mร n hรฌnh. Nแบฟu bแบฏt ฤแบงu bแบฑng bytes null thรฌ sแบฝ bแป ngแบฏt bแปi printf. 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:
ฤรขy lร ฤแปa chแป แป 1 lแบงn chแบกy khรกc nhรฉ. Chรบ รฝ offset lร ฤฦฐแปฃc 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 ฤรจ:
ฤแปa chแป tรดi bรดi ฤen ฤรณ lร phแบงn data tรดi ฤรฃ ghi vร o 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
Ta cรณ size = 0x7f < 0x80 nรชn nรณ sแบฝ thแปa mรฃn ฤiแปu kiแปn cแปงa fastbins vร khรดng gรขy ra lแปi nhฦฐ phรญa trรชn 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:
Lแปi liรชn quan ฤแบฟn bแป nhแป 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.
Ta cแบงn padding 19 bytes trฦฐแปc khi ghi ฤรจ ฤแบฟn __malloc_hook 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
vร mแบฅu chแปt vแบฅn ฤแป แป ฤรขy: Nแบฟu size == \0 --> Chฦฐฦกng trรฌnh sแบฝ in ra lแปi nhฦฐ bแบกn cรณ thแป thแบฅy. 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.