unlink

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 ์ง€์›ํ•˜๊ธฐ

์ฝ”๋“œ

// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c

/* Take a chunk off a bin list.  */
static void
unlink_chunk (mstate av, mchunkptr p)
{
if (chunksize (p) != prev_size (next_chunk (p)))
malloc_printerr ("corrupted size vs. prev_size");

mchunkptr fd = p->fd;
mchunkptr bk = p->bk;

if (__builtin_expect (fd->bk != p || bk->fd != p, 0))
malloc_printerr ("corrupted double-linked list");

fd->bk = bk;
bk->fd = fd;
if (!in_smallbin_range (chunksize_nomask (p)) && p->fd_nextsize != NULL)
{
if (p->fd_nextsize->bk_nextsize != p
|| p->bk_nextsize->fd_nextsize != p)
malloc_printerr ("corrupted double-linked list (not small)");

// Added: If the FD is not in the nextsize list
if (fd->fd_nextsize == NULL)
{

if (p->fd_nextsize == p)
fd->fd_nextsize = fd->bk_nextsize = fd;
else
// Link the nexsize list in when removing the new chunk
{
fd->fd_nextsize = p->fd_nextsize;
fd->bk_nextsize = p->bk_nextsize;
p->fd_nextsize->bk_nextsize = fd;
p->bk_nextsize->fd_nextsize = fd;
}
}
else
{
p->fd_nextsize->bk_nextsize = p->bk_nextsize;
p->bk_nextsize->fd_nextsize = p->fd_nextsize;
}
}
}

๊ทธ๋ž˜ํ”ฝ ์„ค๋ช…

unlink ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ๊ทธ๋ž˜ํ”ฝ ์„ค๋ช…์„ ํ™•์ธํ•˜์„ธ์š”:

https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png

๋ณด์•ˆ ๊ฒ€์‚ฌ

  • ์ฒญํฌ์˜ ์ง€์ •๋œ ํฌ๊ธฐ๊ฐ€ ๋‹ค์Œ ์ฒญํฌ์— ํ‘œ์‹œ๋œ prev_size์™€ ๋™์ผํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ P->fd->bk == P ๋ฐ P->bk->fw == P์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒญํฌ๊ฐ€ ์ž‘์ง€ ์•Š์€ ๊ฒฝ์šฐ, P->fd_nextsize->bk_nextsize == P ๋ฐ P->bk_nextsize->fd_nextsize == P์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„์ˆ˜

unlink๋œ ์ฒญํฌ๋Š” ํ• ๋‹น๋œ ์ฃผ์†Œ๋ฅผ ์ •๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ํฅ๋ฏธ๋กœ์šด ์ฃผ์†Œ๋ฅผ ๋ˆ„์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Libc ๋ˆ„์ˆ˜:

  • P๊ฐ€ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋จธ๋ฆฌ์— ์œ„์น˜ํ•˜๋ฉด, bk๋Š” libc์˜ malloc_state๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
  • P๊ฐ€ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋์— ์œ„์น˜ํ•˜๋ฉด, fd๋Š” libc์˜ malloc_state๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
  • ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ๋ฌด๋ฃŒ ์ฒญํฌ๊ฐ€ ํ•˜๋‚˜๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์„ ๋•Œ, P๋Š” ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ์žˆ์œผ๋ฉฐ, fd์™€ bk ๋ชจ๋‘ malloc_state ๋‚ด๋ถ€์˜ ์ฃผ์†Œ๋ฅผ ๋ˆ„์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํž™ ๋ˆ„์ˆ˜:

  • P๊ฐ€ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋จธ๋ฆฌ์— ์œ„์น˜ํ•˜๋ฉด, fd๋Š” ํž™์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
  • P๊ฐ€ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋์— ์œ„์น˜ํ•˜๋ฉด, bk๋Š” ํž™์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
  • P๊ฐ€ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ์žˆ์œผ๋ฉด, fd์™€ bk ๋ชจ๋‘ ํž™์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

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 ์ง€์›ํ•˜๊ธฐ