Off by one overflow
Last updated
Last updated
AWS ํดํน ํ์ต ๋ฐ ์ค์ต:HackTricks Training AWS Red Team Expert (ARTE) GCP ํดํน ํ์ต ๋ฐ ์ค์ต: HackTricks Training GCP Red Team Expert (GRTE)
1๋ฐ์ดํธ ์ค๋ฒํ๋ก์ฐ์๋ง ์ก์ธ์คํ ์ ์๋ค๋ฉด, ๊ณต๊ฒฉ์๋ ๋ค์ ์ฒญํฌ์ size
ํ๋๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ด๋ค ์ฒญํฌ๊ฐ ์ค์ ๋ก ํด์ ๋๋์ง๋ฅผ ์กฐ์ํ ์ ์์ผ๋ฉฐ, ์ ์ฌ์ ์ผ๋ก ๋ค๋ฅธ ์ ํจํ ์ฒญํฌ๋ฅผ ํฌํจํ๋ ์ฒญํฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด ์ทจ์ฝ์ ์ ์ด์ค ํด์ ๋๋ ์ค์ฒฉ๋ ์ฒญํฌ์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์
์ฉ๋ ์ ์์ต๋๋ค.
์คํ ๋ฐ์ด ์ ์ทจ์ฝ์ ์๋ ๋ ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค:
์์ ๋ฐ์ดํธ: ์ด ์ ํ์ ํด๋น ๋ฐ์ดํธ๋ฅผ ์์์ ๊ฐ์ผ๋ก ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
๋ ๋ฐ์ดํธ (off-by-null): ์ด ์ ํ์ ํด๋น ๋ฐ์ดํธ๋ฅผ 0x00์ผ๋ก๋ง ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ทจ์ฝ์ ์ ์ผ๋ฐ์ ์ธ ์๋ ๋ค์ ์ฝ๋์์ ๋ณผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ strlen
๋ฐ strcpy
์ ๋์์ด ์ผ๊ด๋์ง ์์ ๋ค์ ์ฒญํฌ์ ์์ ๋ถ๋ถ์ 0x00 ๋ฐ์ดํธ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
์ด๋ House of Einherjar๋ก ์ ์ฉ๋ ์ ์์ต๋๋ค.
Tcache๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ด๋ ์ด์ค ํด์ ์ํฉ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๊ทธ ์ธ์ ํ์ธ ์ฌํญ ์ค ํ๋๋ก, ์ด์ ์ฒญํฌ๊ฐ ํด์ ๋ ๋ ์ด์ ํฌ๊ธฐ๊ฐ ๋ฉํ๋ฐ์ดํฐ์ ์ฒญํฌ์ ๊ตฌ์ฑ๋ ํฌ๊ธฐ์ ๋น๊ต๋๋ฏ๋ก 2.28 ๋ฒ์ ๋ถํฐ ์ด ๊ณต๊ฒฉ์ ๊ฝค ๋ณต์กํด์ก์ต๋๋ค.
Tcache ์ฌ์ฉ์ผ๋ก ์ด ๊ณต๊ฒฉ์ ๋ ์ด์ ์๋ํ์ง ์์ต๋๋ค.
๋ ํฐ ์ฒญํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์์๋ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค: malloc(): invalid next size (unsorted)
ํ ์ฒญํฌ๋ฅผ ๋ค๋ฅธ ์ฒญํฌ ์์ ํฌํจ๋๋๋ก ๋ง๋ค์ด ๋ ๋ฒ์งธ ์ฒญํฌ์ ๋ํ ์ฐ๊ธฐ ์ก์ธ์ค๋ฅผ ๊ฐ๋ฅํ๊ฒํ์ฌ ํฌํจ๋ ์ฒญํฌ๋ฅผ ๋ฎ์ด์ธ ์ ์๋๋ก ํจ
์ฌ์ด์ฆ ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ์์ ํ๊ธฐ ์ํ ์คํ ๋ฐ์ด ์ ์ค๋ฒํ๋ก์ฐ
์ธ ๊ฐ์ ์ฒญํฌ A
, B
, C
๋ฅผ ํ ๋นํ๊ณ (ํฌ๊ธฐ 0x20), ์๋จ ์ฒญํฌ์ ๋ณํฉ๋์ง ์๋๋ก ๋ค๋ฅธ ํ๋๋ฅผ ํ ๋นํฉ๋๋ค.
C
๋ฅผ ํด์ ํฉ๋๋ค(0x20 Tcache ํด์ ๋ชฉ๋ก์ ์ฝ์
๋จ).
์ฒญํฌ A
๋ฅผ ์ฌ์ฉํ์ฌ B
์ ์ค๋ฒํ๋ก์ฐํฉ๋๋ค. ์คํ ๋ฐ์ด ์์ ์
์ฉํ์ฌ B
์ size
ํ๋๋ฅผ 0x21์์ 0x41๋ก ์์ ํฉ๋๋ค.
์ด์ B
์๋ ํด์ ๋ ์ฒญํฌ C
๊ฐ ํฌํจ๋ฉ๋๋ค.
B
๋ฅผ ํด์ ํ๊ณ 0x40 ์ฒญํฌ๋ฅผ ํ ๋นํฉ๋๋ค(๋ค์ ์ฌ๊ธฐ์ ๋ฐฐ์น๋จ).
์ฌ์ ํ ํด์ ๋ C
์ธ fd
ํฌ์ธํฐ๋ฅผ ์์ ํ ์ ์์ต๋๋ค(Tcache ๋
์ฑ)
๋ฉ๋ชจ๋ฆฌ์ 3๊ฐ ์ฒญํฌ(a, b, c)๊ฐ ์ฐ์ด์ด ์์ฝ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ค๊ฐ ์ฒญํฌ๊ฐ ํด์ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ฒญํฌ์๋ ์คํ ๋ฐ์ด ์ ์ค๋ฒํ๋ก์ฐ ์ทจ์ฝ์ ์ด ์์ผ๋ฉฐ ๊ณต๊ฒฉ์๊ฐ 0x00์ ์ฌ์ฉํ์ฌ ์ ์ฉํฉ๋๋ค(์ด์ ๋ฐ์ดํธ๊ฐ 0x10์ด๋ฉด ์ค๊ฐ ์ฒญํฌ๊ฐ ์ค์ ๋ณด๋ค 0x10 ์๋ค๊ณ ํ์๋ฉ๋๋ค).
๊ทธ๋ฐ ๋ค์ ์ค๊ฐ ํด์ ๋ ์ฒญํฌ(b)์ 2๊ฐ์ ๋ ์์ ์ฒญํฌ๊ฐ ํ ๋น๋ฉ๋๋ค. ๊ทธ๋ฌ๋ b + b->size
๊ฐ c ์ฒญํฌ๋ฅผ ์
๋ฐ์ดํธํ์ง ์๋ ์ด์ ๋ ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ ์์๋ณด๋ค ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฐ ๋ค์, b1๊ณผ c๊ฐ ํด์ ๋ฉ๋๋ค. ์ฌ์ ํ b1๊ณผ c๋ฅผ ๊ฐ๋ฆฌํค๋ c - c->prev_size
๊ฐ ํ๋์ ์ฒญํฌ๋ก ํตํฉ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ b2๋ ์ฌ์ ํ b1๊ณผ c ์ฌ์ด์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ค์ ์๊ตฌํ๋ ์๋ก์ด malloc์ด ์ํ๋์ด b2๋ฅผ ํฌํจํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ malloc์ ์์ ์๊ฐ b2์ ๋ด์ฉ์ ์ ์ดํ ์ ์์ต๋๋ค.
์ด ์ด๋ฏธ์ง๋ ๊ณต๊ฒฉ์ ์๋ฒฝํ๊ฒ ์ค๋ช ํฉ๋๋ค:
strlen
์ด ๋ค์ ์ฒญํฌ์ size
ํ๋๋ฅผ ๊ณ ๋ คํ๊ธฐ ๋๋ฌธ์ ์คํ ๋ฐ์ด ์์ด ๋ฐ์ํฉ๋๋ค.
Tcache๊ฐ ์ฌ์ฉ๋๊ณ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ธ ์คํ ๋ฐ์ด ์ ๊ณต๊ฒฉ์ ์ฌ์ฉํ์ฌ Tcache ๋ ์ฑ์ผ๋ก ์์ ์ฐ๊ธฐ ์์๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์คํ ๋ฐ์ด ์์ ์ ์ฉํ์ฌ ํ์์ ์ฃผ์๋ฅผ ๋์ถํ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ๋ฌธ์์ด ๋์ 0x00 ๋ฐ์ดํธ๊ฐ ๋ค์ ํ๋์ ์ํด ๋ฎ์ด์์์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
์คํ ๋ฐ์ด ์ ์ฐ๊ธฐ๋ฅผ ์ ์ฉํ์ฌ ํฌ์ธํฐ๊ฐ ๊ฐ์ง ๊ตฌ์กฐ์ฒด์ ๊ฐ์ง ํฌ์ธํฐ๊ฐ ์๋ ๋ค๋ฅธ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด ๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด ์์ ์ฐ๊ธฐ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
libc ์ฃผ์๊ฐ ๋์ถ๋๋ ์ด์ ๋ ํ์ด mmap์ ์ฌ์ฉํ์ฌ ํ์ฅ๋ ๋ mmap์ ์ํด ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ libc๋ก๋ถํฐ ๊ณ ์ ๋ ์คํ์ ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์์ ์ฐ๊ธฐ๋ฅผ ์ ์ฉํ์ฌ __free_hook ์ฃผ์์ ์ ๊ฐ์ ฏ์ ์ฐ๊ธฐ ์ํด ์ฃผ์๋ฅผ ์ธ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์
๋ ฅ ๋ผ์ธ์ ์ฝ๋ getline
ํจ์์ NULL ์คํ ๋ฐ์ด ์ ์ทจ์ฝ์ ์ด ์์ต๋๋ค. ์ด ํจ์๋ ์ฝํ
์ธ ์ "ํค"๋ฅผ ์ฝ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
writeup์์ ์ด๊ธฐ 5๊ฐ์ ์ฒญํฌ๊ฐ ์์ฑ๋ฉ๋๋ค:
์ฒญํฌ1 (0x200)
์ฒญํฌ2 (0x50)
์ฒญํฌ5 (0x68)
์ฒญํฌ3 (0x1f8)
์ฒญํฌ4 (0xf0)
์ฒญํฌ ๋ฐฉ์ด (0x400) ์๋จ ์ฒญํฌ์ ๋ณํฉ์ ํผํ๊ธฐ ์ํด
๊ทธ๋ฐ ๋ค์ ์ฒญํฌ 1, 5 ๋ฐ 3์ด ํด์ ๋ฉ๋๋ค. ๋ฐ๋ผ์:
[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]
[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]