Stack Smashing Protector(SSP)๋ BOF๋ก๋ถํฐ ret ๋ณดํธ ๊ธฐ๋ฒ์ผ๋ก์จ,
์คํ ๋ฒํผ๊ฐ ์กด์ฌํ๋ ํจ์ ๋ด๋ถ์์ ์์๋ก ์์ฑ๋ ๊ฐ์ ๋ฒํผ ๋ง์ง๋ง์ ์ฝ์
ํฉ๋๋ค.
SSP ๋ณดํธ ๊ธฐ๋ฒ์ ๋ฐฐ์ธ ๋ ์คํ ์นด๋๋ฆฌ์ ๊ฐ์ด ์์นํ Thread Local Storage(TLS)์ ๋ํ ์์ธํ ๋ด ์๋ค.
Thread Local Storage
์ค๋ ๋์ ์ ์ฅ ๊ณต๊ฐ
ELF ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ดํด๋ณด๋ฉด, ๊ฐ ๋ชฉ์ ์ ๊ฐ์ง ์น์
์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
์ฝ๋๋ฅผ ์คํ(.text), ์ด๊ธฐํ X ์ ์ญ ๋ณ์(.data) ๋ฑ์ด ์๊ฒ ์ต๋๋ค.
์ด์ ๋ฌ๋ฆฌ TLS ์์ญ์ ์ค๋ ๋์ ์ ์ญ ๋ณ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๊ณต๊ฐ์ผ๋ก, ๋ก๋(Loader)์ ์ํด ํ ๋น๋จ
๋ก๋์์ TLS ์ฌ์ญ์ ํ ๋นํ๊ณ ์ด๊ธฐํํ๋ ํจ์์ธ init_tls ํจ์์
๋๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด, _dl_allocate_tls_storage ํจ์์์ TLS ์์ญ์ ํ ๋นํฉ๋๋ค.
์ด๋ฅผ tcbp์ ์ ์ฅํ ๋ค TLS_INIT_TP ๋ฉํฌ๋ก์ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
SET_FS
dl_allocate_tls_storage์์ ํ ๋นํ TLS ์์ญ์ FS๋ก ์ด๊ธฐํ ํ๋ TLS_INIT_TP ๋ฉํฌ๋ก์ด๋ฉฐ,
์ด์
์ผ๋ก ๊ตฌํํ๋ฉด, arch_prctl ์์คํ
์ฝ์ ์ฒซ ์ธ์๋ก ARCH_SET_FS์ด๋ฉฐ,
๋๋ฒ์งธ ์ธ์๋ก ํ ๋นํ TLS ์ฃผ์๊ฐ ์ ๋ฌ๋จ์ ํ์ธํ ์ ์์ต๋๋ค.
arch_prctl ์์คํ
์ฝ์ ARCH_SET_FS๋ ํ๋ก์ธ์ค์ FS ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ๋ฅผ ์ด๊ธฐํํ๋ ์์
์ ์ํ
๋ฐ๋ผ์ FS ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ๋ TLS ์์ญ์ ๊ฐ๋ฅดํค๊ฒ ๋ฉ๋๋ค.
Master Canary
์คํ ๋ฒํผ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํจ์์์ ๊ฐ์ ์นด๋๋ฆฌ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฐ ํน์ง ๋๋ฌธ์ ์์ ํจ์์์ ๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ ์์๋ธ๋ค๋ฉด ๋ค๋ฅธ ํจ์์ ์์ฉํ ์ ์์ต๋๋ค.
SSP ๋์ ์๋ฆฌ๋ฅผ ๋์ง์ผ๋ฉด, ๋ฒํผ๋ฅผ ์ฌ์ฉํ๋ ํจ์์ ํ๋กค๋ก๊ทธ์์
FS:0x28์ ์์นํ ๊ฐ์ ๊ฐ์ ธ์ RBP ๋ฐ๋ก ์์ ์ฝ์ ํฉ๋๋ค
FS ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ๋ ์์ arch_prctl ์์คํ
์ฝ์ ํตํด _dl_allocate_tls_storage์์
ํ ๋นํ ์ฃผ์๋ก, ๋ชจ๋ ํจ์๊ฐ ํด๋น ์ฃผ์์์ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ์ ์นด๋๋ฆฌ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ ๊ฒ TLS ์ฃผ์์ 0x28 ๋ฐ์ดํธ๋งํผ ๋จ์ด์ง ์ฃผ์์ ์์นํ ๋๋ค ๊ฐ์ ๋ง์คํฐ ์นด๋๋ฆฌ(master Canary)!
์ด์ ์ ํ ๋นํ TLS ์์ญ์ ๋๋คํ ์นด๋๋ฆฌ ๊ฐ์ ์ฝ์
ํ๋ security_init ํจ์์
๋๋ค.
_dl_setup_stack_chk_guard ํจ์๋ ์ปค๋์์ ์์ฑํ ๋๋ค ๊ฐ์ ์ง๋
ํฌ์ธํฐ _dl_random์ ์ธ์๋ก ์นด๋๋ฆฌ ์์ฑํจ
์นด๋๋ฆฌ ๊ฐ ์์ฑ
security_init ํจ์์์ ์ฒ์ ํธ์ถํ๋ _dl_setup_stack_chk_guard ํจ์์
๋๋ค.
ํจ์ ์ฝ๋๋ฅผ ๋ณด์๋ฉด, ๊ณต์ฉ์ฒด ๋ณ์์ธ ret์ ์ปค๋์์ ์์ฑํ ๋๋คํ ๊ฐ์
๊ฐ์ง dl_random์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค.
์ดํ ๋ฐ์ด๋๋ฆฌ์ ๋ฐ์ดํธ ์ค๋๋ง(Byte Ordering)์ ๋ฐ๋ผ AND ์ฐ์ฐ์ ์ํํ๋๋ฐ,
๋ฆฌํ ์๋์ธ์ ๊ฒฝ์ฐ ๋ณต์ฌํ ๊ฐ์ ์ฒซ ๋ฐ์ดํธ๋ฅผ NULL๋ก ๋ณํํฉ๋๋ค.
๋ฐ์ดํธ ์ค๋๋ง(Byte Ordering)
๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์์(little endian, big endian)
๋ ์ ํํ ๋ด์ฉ์ endian์ ํ์์ ์ดํดํ๋ฏ๋ก ์ฌ๊ธฐ์ ๋งํฌ๋ก ํ์ธํด์ฃผ์ธ์
์นด๋๋ฆฌ ๊ฐ ์ฝ์
_dl_setup_stack_chk_guard์์ ์นด๋๋ฆฌ ๊ฐ์ ์์ฑํ๋ค๋ฉด, ํด๋น ๊ฐ์
THREAD_SET_STACK_GUARD ๋งคํฌ๋ก์ ์ธ์๋ก ์ ๋ฌํด ํธ์ถํฉ๋๋ค.
ํด๋น ๋งคํฌ๋ก ์ ์ธ๋ถ๋ก, THREAD_SETMEM ๋งคํฌ๋ก๋ฅผ ํตํด ๋ ๋ฒ์งธ ์ธ์์ธ
header.stack_guard ์์น์ value๋ฅผ ์ฝ์
ํฉ๋๋ค.
ํ ๋นํ TLS์์ญ์ tcphead_t ๊ตฌ์กฐ์ฒด๋ก ๊ตฌ์ฑ๋์ด ์๋๋ฐ, stack_guard๋
์คํ ์นด๋๋ฆฌ์ ๊ฐ์ ๊ฐ์ง๋ ๋ฉค๋ฒ ๋ณ์์
๋๋ค.
๋ฐ๋ผ์ THREAD_SET_STACK_GUARD๋ TLS+0x28 ์์น์
์์ฑ๋ ์นด๋๋ฆฌ ๊ฐ์ ์ฝ์
ํ๋ ๋งคํฌ๋ก์
๋๋ค.
๋๋ฒ๊น
12345678910 // Name: master_canary.c// Compile: gcc -o master_canary master_canary.c -no-pie#include <stdio.h>#include <unistd.h>int main(){char buf[256];read(0, buf, 256);}cs
์ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ๋๋ฒ๊น ์ ํตํด ๋ง์คํฐ ์นด๋๋ฆฌ๋ฅผ ์ฐพ์๋ด ์๋ค.
gdb์์ fs ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ์ ์ฃผ์๋ฅผ ์์ ๊ฐ์ด ํ์ธ ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด TLS ์ฃผ์์ ์๋ ๋ง์คํฐ ์นด๋๋ฆฌ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค
๋ง์น๋ฉฐ
์คํ ์นด๋๋ฆฌ๋ ๋ก๋ ๋ด๋ถ์์ ์ปค๋์ด ์์ฑํ ๋๋คํ ๊ฐ์ ๊ฐ๊ณตํ์ฌ ๋ง๋ค์ด์ง ๊ฐ์ ๋๋ค.
์ด๋ ๊ฒ ๋ง๋ค์ด์ง ์นด๋๋ฆฌ ๊ฐ์ ๋ง์คํฐ ์นด๋๋ฆฌ๋ผ๊ณ ํ๋ฉฐ,
๋ชจ๋ ํจ์์์ ๊ฐ๊ณ ์ฌ ์ ์๋๋ก TLS+0x28์์น์ ๋ณต์ฌํฉ๋๋ค.
- Thread Local Storage (TLS)
: ์ค๋ ๋์ ์ ์ฅ ๊ณต๊ฐ์ ์๋ฏธ
- ๋ชจ๋ ์ค๋ ๋๊ฐ ์ฐธ์กฐํ ์ ์๋ ์ ์ญ ๋ณ์๋ฅผ ์ ์ฅํ๋๋ฐ์ ์ฐ์ - Master Canary
: TLS ์ฃผ์์ 0x28 ๋ฐ์ดํธ ๋งํผ ๋จ์ด์ง ์ฃผ์์ ์์นํ ๋๋คํ ๊ฐ,
- ๋ชจ๋ ํจ์์์ ํด๋น ๊ฐ์ ์คํ ์นด๋๋ฆฌ๋ก ์ฌ์ฉํจ
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Master Canary (0) | 2022.11.13 |
---|---|
Exploit Tech: Master Canary (0) | 2022.11.13 |
seccomp (0) | 2022.11.06 |
Bypass SECCOMP-1 (0) | 2022.11.06 |
tcache_dup2 (0) | 2022.11.06 |