songining

์˜ค๋Š˜์€ ์Šคํƒ ์นด๋‚˜๋ฆฌ์— ๋Œ€ํ•ด ๊ณต๋ถ€๋ฅผ ํ•  ๊ฒƒ์ด๋‹ค! 

 

์Šคํƒ์นด๋‚˜๋ฆฌ๋ž€?

- ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ณดํ˜ธ๊ธฐ๋ฒ• 

- ์Šคํƒ ์นด๋‚˜๋ฆฌ๋Š” ํ•จ์ˆ˜์˜ ํ”„๋กค๋กœ๊ทธ์—์„œ ์Šคํƒ ๋ฒ„ํผ์™€ ๋ฐ˜ํ™˜ ์ฃผ์†Œ ์‚ฌ์ด์— ์ž„์˜์˜ ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๊ณ , ํ•จ์ˆ˜์˜ ์—ํ•„๋กœ๊ทธ์—์„œ ํ•ด๋‹น ๊ฐ’์˜ ๋ณ€์กฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ณดํ˜ธ ๊ธฐ๋ฒ•์ด๋‹ค. ์นด๋‚˜๋ฆฌ ๊ฐ’์˜ ๋ณ€์กฐ๊ฐ€ ํ™•์ธ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ๋œ๋‹ค!@! 

 

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_]