์คํ ์นด๋๋ฆฌ (Stack canary)
์ค๋์ ์คํ ์นด๋๋ฆฌ์ ๋ํด ๊ณต๋ถ๋ฅผ ํ ๊ฒ์ด๋ค!
์คํ์นด๋๋ฆฌ๋?
- ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ก๋ถํฐ ๋ฐํ ์ฃผ์๋ฅผ ๋ณดํธํ๋ ๋ณดํธ๊ธฐ๋ฒ
- ์คํ ์นด๋๋ฆฌ๋ ํจ์์ ํ๋กค๋ก๊ทธ์์ ์คํ ๋ฒํผ์ ๋ฐํ ์ฃผ์ ์ฌ์ด์ ์์์ ๊ฐ์ ์ฝ์ ํ๊ณ , ํจ์์ ์ํ๋ก๊ทธ์์ ํด๋น ๊ฐ์ ๋ณ์กฐ๋ฅผ ํ์ธํ๋ ๋ณดํธ ๊ธฐ๋ฒ์ด๋ค. ์นด๋๋ฆฌ ๊ฐ์ ๋ณ์กฐ๊ฐ ํ์ธ๋๋ฉด ํ๋ก์ธ์ค๋ ๊ฐ์ ๋ก ์ข ๋ฃ๋๋ค!@!
fs? -> TLS(Thread Local Storage)์ ์นด๋๋ฆฌ๋ฅผ ๋น๋กฏํ์ฌ ํ๋ก์ธ์ค ์คํ์ ํ์ํ ์ฌ๋ฌ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค๊ณ ๋ง ์ผ๋จ ์๊ณ ์์
Ex) ์๋ฅผ ๋ค์ด buf[8]์ readํ๋ ํจ์์ ๋ํด ์คํ๋ฒํผ์ค๋ฒํ๋ก์ฐ ๊ณต๊ฒฉ์ ์งํํ ๊ฒฝ์ฐ
rbp-8 ์ ์ ์ฅ๋ ์นด๋๋ฆฌ์ fs:0x28 ์ ์ ์ฅ๋ ์นด๋๋ฆฌ๋ฅผ xorํด์ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ 0์ด๋ฉด je ์ฑ๊ณต์ผ๋ก ์ ์ ๋ฐํ!
๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ __stack_chk_fail ํธ์ถ๋๋ฉด์ ํ๋ก๊ทธ๋จ ๊ฐ์ ์ข ๋ฃ!!
์นด๋๋ฆฌ ์์ฑ ๊ณผ์
์นด๋๋ฆฌ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์์๋ ๋, TLS์ ์ ์ญ ๋ณ์๋ก ์ ์ฅ๋๊ณ , ๊ฐ ํจ์๋ง๋ค ํ๋กค๋ก๊ทธ์ ์ํ๋ก๊ทธ์์ ์ด ๊ฐ์ ์ฐธ์กฐ
fs ๋ TLS๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก fs์ ๊ฐ์ ์๋ฉด TLS์ ์ฃผ์๋ฅผ ์ ์ ์๋ค.
fs๋ p $fs ์ ๊ฐ์ gdb ๋ช ๋ น์ด๋ก ๊ฐ์ ์ ์ ์๋ค. ์ฆ, fs์ ๊ฐ์ ์ค์ ํ ๋ ํธ์ถ๋๋ arch_prctl(int code, unsigned long addr) ์์คํ ์ฝ์ ์ค๋จ์ ์ ์ค์ ํ์ฌ fs๊ฐ ์ด๋ค ๊ฐ์ผ๋ก ์ค์ ๋๋์ง ์กฐ์ฌํด์ผ ํ๋ค.
catch syscall arch_prctl
run
info r #rsi ์ฃผ์๊ฐ์ด tls ์ ์ฅ๋๋ ์ฃผ์(์ฆ fs) ๋์ ๊ฒฝ์ฐ 0x7fffffffdef0
watch *(0x7fffffffdef0+0x28) # ์นด๋๋ฆฌ ๊ฐ์ด ๋ค์ด๊ฐ ์ฃผ์์ ๊ฐ ๋ณ๊ฒฝ ํ์ธ์ ์ํด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ํ๋ก์ธ์ค ์ค๋จ์ํค๋ ๋ช
๋ น์ด
c(continue)
x/gx 0x7fffffffdef0+0x28 # ์นด๋๋ฆฌ์ ๋ค์ด๊ฐ ๊ฐ
# security_init ํจ์์์ TLS์ ๋๋ค ๊ฐ์ผ๋ก ์นด๋๋ฆฌ๋ฅผ ์ค์ ํ๋ฉด, ๋งค ํจ์์์ ์ด๋ฅผ ์ฐธ์กฐํ์ฌ ์ฌ์ฉ
32bit๋ gs:0x14, 64bit๋ QWORD PTR fs:0x28์ ํตํด canary๋ฅผ ์ป์ด์จ๋ค.
๊ทธ๋์ ์นด๋๋ฆฌ ์ฐํ ๋ฐฉ๋ฒ์?!!
1. ๋ฌด์ฐจ๋ณ ๋์ (๋ธ๋ฅดํฌํฌ์ค)
- x64 ์ํคํ ์ฒ์์๋ 8๋ฐ์ดํธ์ ์นด๋๋ฆฌ, x86 ์ํคํ ์ฒ์์๋ 4๋ฐ์ดํธ์ ์นด๋๋ฆฌ ์์ฑ
๊ฐ๊ฐ์ ์นด๋๋ฆฌ์๋ NULL๋ฐ์ดํธ๊ฐ ํฌํจ๋์ด ์์ด, ์ค์ ๋ก๋ 7๋ฐ์ดํธ์ 3๋ฐ์ดํธ์ ๋๋คํ ๊ฐ์ด ํฌํจ๋๋ค.
๊ทธ๋ฌ๋ 7๋ฐ์ดํธ์ 3๋ฐ์ดํธ์ง๋ฆฌ๋ฅผ ์ ๋ถ ๋ธ๋ฅดํฌํฌ์ค๋ก ์ฐ์ฐํด์ ์นด๋๋ฆฌ๋ฅผ ์์๋ด๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ..
2. TLS ์ ๊ทผ
์นด๋๋ฆฌ๋ TLS์ ์ ์ญ๋ณ์๋ก ์ ์ฅ๋๋ฉฐ, ๋งค ํจ์๋ง๋ค ์ด๋ฅผ ์ฐธ์กฐํด์ ์ฌ์ฉํ๋ค.
TLS์ ์ฃผ์๋ ๋งค ์คํ๋ง๋ค ๋ฐ๋์ง๋ง ๋ง์ฝ ์คํ์ค์ TLS์ ์ฃผ์๋ฅผ ์ ์ ์๊ณ , ์์์ ์ฃผ์์ ๋ํ ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด TLS์ ์ค์ ๋ ์นด๋๋ฆฌ ๊ฐ์ ์ฝ๊ฑฐ๋, ์ด๋ฅผ ์์์ ๊ฐ์ผ๋ก ์กฐ์ํ ์ ์๋ค. ์ฆ ์นด๋๋ฆฌ ๊ฐ์ ์์๋ด๊ฑฐ๋ ์นด๋๋ฆฌ ๊ฐ์ ์กฐ์ํด์ ๊ฒ์ฌ๋ฅผ ์ฐํํ์.
3. ์คํ ์นด๋๋ฆฌ ๋ฆญ
ํจ์์ ํ๋กค๋ก๊ทธ์์ ์คํ์ ์นด๋๋ฆฌ ๊ฐ์ ์ ์ฅํ๋ฏ๋ก, ์ด๋ฅผ ์ฝ์ด๋ผ ์ ์์ผ๋ฉด ์นด๋๋ฆฌ๋ฅผ ์ฐํํ ์ ์๋ค.
๊ฐ์ฅ ํ์ค์ ์ธ ์นด๋๋ฆฌ ์ฐํ๊ธฐ๋ฒ
์นด๋๋ฆฌ ์คํ ๊ตฌ์กฐ (x64)
Ex)
memo[8], name[8] ์ฝ์ด์์ผ ํ๋ ๊ฒฝ์ฐ (read)
buf(16) | canary(8) | sfp(8) | ret(8)
[์ถ์ฒ]
dreamhack
https://nekoplu5.tistory.com/206 [NekoPlus_]