Page cover

๐Ÿ˜žHeap 2

Double Free

Challenge

file-download
2MB
file-download
10MB

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.

triangle-exclamation

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 ฤ‘รณ
triangle-exclamation

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
circle-info

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 sitearrow-up-right ฤ‘แป‹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.

OKE

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.

circle-exclamation
circle-info

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.

แบขnh minh hแปa
circle-exclamation
Sau khi free dรฒng 4
Sau khi free แปŸ dรฒng 5

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:

circle-exclamation

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
circle-exclamation

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.

Oke

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

  1. 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.

  1. 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.

Last updated