Large Bin Attack

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

Basic Information

๋Œ€ํ˜• ๋นˆ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ์ด ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”:

Bins & Memory Allocations

how2heap - large bin attack์—์„œ ํ›Œ๋ฅญํ•œ ์˜ˆ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ๊ธฐ์—์„œ glibc์˜ ์ตœ์‹  โ€œํ˜„์žฌโ€ ๋ฒ„์ „(2.35)์—์„œ **P->bk_nextsize**๊ฐ€ ํ™•์ธ๋˜์ง€ ์•Š์•„ ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ๋Œ€ํ˜• ๋นˆ ์ฒญํฌ์˜ ๊ฐ’์œผ๋กœ ์ž„์˜์˜ ์ฃผ์†Œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์˜ˆ์ œ์—์„œ ๋‹ค์Œ ์กฐ๊ฑด์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋Œ€ํ˜• ์ฒญํฌ๊ฐ€ ํ• ๋‹น๋จ
  • ์ฒซ ๋ฒˆ์งธ ์ฒญํฌ๋ณด๋‹ค ์ž‘์ง€๋งŒ ๊ฐ™์€ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๋Œ€ํ˜• ์ฒญํฌ๊ฐ€ ํ• ๋‹น๋จ
  • ๋นˆ์—์„œ ๋จผ์ € ๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ ๋” ์ž‘์•„์•ผ ํ•จ
  • (์ƒ๋‹จ ์ฒญํฌ์™€ ๋ณ‘ํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ฒญํฌ๊ฐ€ ์ƒ์„ฑ๋จ)
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฒซ ๋ฒˆ์งธ ๋Œ€ํ˜• ์ฒญํฌ๊ฐ€ ํ•ด์ œ๋˜๊ณ  ๊ทธ๋ณด๋‹ค ํฐ ์ƒˆ ์ฒญํฌ๊ฐ€ ํ• ๋‹น๋จ -> Chunk1์ด ๋Œ€ํ˜• ๋นˆ์œผ๋กœ ์ด๋™
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‘ ๋ฒˆ์งธ ๋Œ€ํ˜• ์ฒญํฌ๊ฐ€ ํ•ด์ œ๋จ
  • ์ด์ œ ์ทจ์•ฝ์ : ๊ณต๊ฒฉ์ž๋Š” chunk1->bk_nextsize๋ฅผ [target-0x20]๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฒญํฌ 2๋ณด๋‹ค ํฐ ์ฒญํฌ๊ฐ€ ํ• ๋‹น๋˜๋ฏ€๋กœ chunk2๊ฐ€ ๋Œ€ํ˜• ๋นˆ์— ์‚ฝ์ž…๋˜์–ด chunk1->bk_nextsize->fd_nextsize์˜ ์ฃผ์†Œ๋ฅผ chunk2์˜ ์ฃผ์†Œ๋กœ ๋ฎ์–ด์”€

Tip

๋‹ค๋ฅธ ์ž ์žฌ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋Œ€ํ˜• ๋นˆ์— ํ˜„์žฌ ๋นˆ์˜ X ์ฒญํฌ๋ณด๋‹ค ์ž‘์€ ์ฒญํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋นˆ์—์„œ X ๋ฐ”๋กœ ์•ž์— ์‚ฝ์ž…๋˜์–ด์•ผ ํ•˜๋ฉฐ, X์˜ **bk_nextsize**๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋” ์ž‘์€ ์ฒญํฌ์˜ ์ฃผ์†Œ๊ฐ€ ๊ธฐ๋ก๋  ์œ„์น˜์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ malloc์˜ ๊ด€๋ จ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ฃผ์†Œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฎ์–ด์”Œ์›Œ์กŒ๋Š”์ง€ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฃผ์„์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
{
fwd = bck; // fwd = p1
bck = bck->bk; // bck = p1->bk

victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}

์ด๊ฒƒ์€ libc์˜ global_max_fast ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ดํ›„ ๋” ํฐ ์ฒญํฌ๋กœ ๋น ๋ฅธ ๋นˆ ๊ณต๊ฒฉ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ํ›Œ๋ฅญํ•œ ์„ค๋ช…์€ guyinatuxedo์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜ˆ์‹œ

  • La casa de papel. HackOn CTF 2024
  • how2heap์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ์˜ ๋Œ€ํ˜• ๋นˆ ๊ณต๊ฒฉ.
  • ์“ฐ๊ธฐ ์›์‹œ ์ž‘์—…์€ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด global_max_fast๋Š” ์—ฌ๊ธฐ์„œ ์“ธ๋ชจ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • FSOP๊ฐ€ ๊ณต๊ฒฉ์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ