Jastes 2022. 4. 28. 12:15


์Šคํƒ ์นด๋‚˜๋ฆฌ(Stack Canary)

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

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

 

BOF๋กœ RET๋ฅผ ๋ฎ์œผ๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์นด๋‚˜๋ฆฌ๋ฅผ ๋จผ์ € ๋ฎ์–ด์•ผํ•˜๋ฏ€๋กœ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ๋ชจ๋ฅด๋Š” ๊ณต๊ฒฉ์ž๋Š”
๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋ฎ์„ ๋•Œ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ๋ณ€์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•˜๋‹ค๋ฉด ๋ณ€์กฐ๊ฐ€ ํ™•์ธ๋˜์–ด
๊ณต๊ฒฉ์ž๋Š” ์‹คํ–‰ ํ๋ฆ„์„ ํš๋“ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

TMI. ์นด๋‚˜๋ฆฌ๋ผ๋Š” ์ด๋ฆ„์˜ ์œ ๋ž˜

 ์นด๋‚˜๋ฆฌ ๋ณดํ˜ธ ๊ธฐ๋ฒ•์˜ ์ด๋ฆ„์€ ์นด๋‚˜๋ฆฌ์•„(Canary)๋ผ๋Š” ์ƒˆ์—์„œ ์œ ๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 19์„ธ๊ธฐ, 20์„ธ๊ธฐ์—๋Š” ์ผ์‚ฐํ™”ํƒ„์†Œ ๋†๋„์˜ ์ธก์ • ๊ธฐ์ˆ ์ด ๋ถ€์กฑํ–ˆ๊ณ , ํƒ„๊ด‘์—์„œ ์œ ์ถœ๋œ ์ผ์‚ฐํ™”ํƒ„์†Œ์— ๊ด‘๋ถ€๊ฐ€ ์ค‘๋…์‚ฌํ•˜๋Š” ์‚ฌ๊ฑด์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ด‘๋ถ€๋“ค์€ ์‚ฌ๋žŒ๋ณด๋‹ค ์ผ์‚ฐํ™”ํƒ„์†Œ์˜ ๋†๋„์— ๋ฏผ๊ฐํ•˜๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š” ์นด๋‚˜๋ฆฌ์•„์™€ ํ•จ๊ป˜ ํƒ„๊ด‘์— ๋“ค์–ด๊ฐ”์Šต๋‹ˆ๋‹ค. ์นด๋‚˜๋ฆฌ์•„๊ฐ€ ์ผ์‚ฐํ™”ํƒ„์†Œ์— ๋ฐ˜์‘ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ด‘๋ถ€๋“ค์€ ์ผ์‚ฐํ™”ํƒ„์†Œ์˜ ๋†๋„๊ฐ€ ์œ„ํ—˜ ์ˆ˜์ค€์— ๋‹ค๋‹ค๋ž๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  ๋Œ€ํ”ผํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 ์ด๋Ÿฐ ์—ญ์‚ฌ์  ๋ฐฐ๊ฒฝ์œผ๋กœ ์ธํ•ด ์นด๋‚˜๋ฆฌ์•„๋Š” “์œ„ํ—˜์„ ์•Œ๋ ค์ฃผ๋Š” ์ƒˆ”๋ผ๋Š” ์ƒ์ง•์  ์˜๋ฏธ๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ถœ์‹œํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ๋•Œ, ๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ ์šฉ๋„๋กœ ๊ณต๊ฐœํ•˜๋Š” ๋ฒ„์ „์„ ์นด๋‚˜๋ฆฌ ๋ฒ„์ „์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ๋„ ์ด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ๋ฐ˜์˜๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์นด๋‚˜๋ฆฌ ๋ณดํ˜ธ ๊ธฐ๋ฒ•๋„ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊ฐ€ ๋ฎ์ธ ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค๋Š” ์˜๋ฏธ์—์„œ “์นด๋‚˜๋ฆฌ”๋กœ ์ด๋ฆ„ ๋ถ™์—ฌ์กŒ์Šต๋‹ˆ๋‹ค
 

[์ž ๊น๊ณผํ•™]๊ด‘๋ถ€๋ฅผ ๊ตฌํ•œ ์ƒ๋ช…์˜ ์ง€์ €๊ท ํƒ„๊ด‘์˜ ์นด๋‚˜๋ฆฌ์•„

๋ฏธ๊ตญ ๊ด‘์‚ฐ๊ตญ ์ œ๊ณต‘ํƒ„๊ด‘์˜ ์นด๋‚˜๋ฆฌ์•„’๋Š”๋‹ค๊ฐ€์˜จ ์œ„ํ—˜์„ ๋จผ์ € ์•Œ๋ ค์ฃผ๋Š” ๋Œ€์ƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ง์ž…๋‹ˆ๋‹ค. ํƒ„๊ด‘์—์„œ ๋‚˜์˜ค๋Š” ์œ ๋… ๊ฐ€์Šค์— ์ฃฝ๊ฑฐ๋‚˜ ๋‹ค์น˜๋Š” ์ผ์„ ํ”ผํ•˜๊ณ ์ž ๊ด‘๋ถ€๋“ค์ด ์œ ๋… ๊ฐ€์Šค์— ๋ฏผ๊ฐํ•œ ์นด

www.dongascience.com:443


์นด๋‚˜๋ฆฌ ์ž‘๋™ ์›๋ฆฌ

// Name: canary.c
 
#include <unistd.h>
 
int main() {
  char buf[8];
  read(0, buf, 32);
  return 0;
}

์œ„ ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ณดํ˜ธ ๊ธฐ๋ฒ•์˜ ์ ์šฉ์— ๋Œ€ํ•œ ์ฐจ์ด์ ๊ณผ ํŠน์ง•์„ ์•Œ์•„๋ด…์‹œ๋‹ค!


์นด๋‚˜๋ฆฌ ๋น„ํ™œ์„ฑํ™”

์‹ค์Šต ํ™˜๊ฒฝ์ธ Ubuntu 18.04์˜ gcc๋Š” ์ž๋™์œผ๋กœ ์Šคํƒ ์นด๋‚˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜๊ธฐ์— ์ปดํŒŒ์ผ ์˜ต์…˜์œผ๋กœ
-fno-stack-protector ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ์˜ˆ์ƒํ–ˆ๋˜ ๊ฑฐ์ฒ˜๋Ÿผ core file์ด ์ƒ์„ฑ๋œ ๋ชจ์Šต์ด์ฃ 
์ฐธ๊ณ ๋กœ ํ™˜๊ฒฝ๋งˆ๋‹ค ๊ฒฝ๊ณ ๋ฌธ ๋ ์šฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ -w ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์–ด์š”

 

์ž ๊ทธ๋Ÿผ segmentation fault๋ฅผ ๋„์› ์œผ๋‹ˆ๊นŒ ๋ถ„์„์€ ์ข€ ์žˆ๋‹ค๊ฐ€ ํ•˜๊ณ  ๋‹ค์Œ์œผ๋กœ๋Š”..

์นด๋‚˜๋ฆฌ ํ™œ์„ฑํ™”

๋ณด์‹œ๋ฉด.. Segmentation fault๊ฐ€ ์•„๋‹ˆ๋ผ 
stack smashing detected์™€ Aborted๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š”๋ฐ..

 

์นผ๋ฆฌ๋ฆฌ๋ˆ…์Šค๋ผ์„œ.. ๊ทธ๋Ÿฐ๊ฐ€์š”? ๊ณต๋ถ€๋ฅผ ํ• ์ˆ˜๋ก ์˜๋ฌธ๋งŒ ๋Š˜์–ด๊ฐ€๋Š”๊ฒŒ.. ํž˜๋“œ๋„ค์š”ใ… 
์จ‹๋“  ์ € ์—๋Ÿฌ๋“ค์„ ๋ถ„์„ํ•˜๋ฉด Stack BOF๊ฐ€ ํƒ์ง€๋˜์–ด ํ”„๋กœ์„ธ์Šค ๊ฐ•์ œ ์ข…๋ฃŒ!๋ผ๋Š” ์ด์•ผ๊ธฐ

canary & no_canary

์ ์šฉ๋œ ๋ชจ์Šต๊ฐ€ ์•ˆ๋œ ๋ชจ์Šต์˜ ์ฐจ์ด๊ฐ€ ์ด๋ ‡๊ฒŒ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค
์Œ.. ๊ทธ๋Ÿผ ์ถ”๊ฐ€๋œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณผ๊นŒ์š”

 

์•„.. ๊ทผ๋ฐ ์ฐธ๊ณ ๋กœ kali๋Š” canary๊ฐ€ ์ ์šฉ์ด ์•ˆ๋˜๋”๋ผ๊ณ ์š”..
๊ทธ๋ž˜์„œ ์œ„ ๋ช…๋ น์–ด๋ฅผ ์ณ์„œ ๋ณดํ˜ธ ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

gcc -fstack-protector canary.c

dreamhack Good!!


์นด๋‚˜๋ฆฌ ๋™์  ๋ถ„์„

์นด๋‚˜๋ฆฌ ์ €์žฅ(canary๋ณดํ˜ธ๊ธฐ๋ฒ• ์ ์šฉ)

์ถ”๊ฐ€๋œ ํ”„๋กค๋กœ๊ทธ์˜ ์ฝ”๋“œ์— ์ค‘๋‹จ์ ์„ ์„ค์ • ํ›„ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰

์ค‘๋‹จ์ (main+8)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ rax์— ์ €์žฅ
fs๋Š” ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ผ์ข…์œผ๋กœ, ๋ฆฌ๋ˆ…์Šค๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ fs:0x28์— ๋žœ๋ค ๊ฐ’์œผ๋กœ ์ €์žฅ

 

๋”ฐ๋ผ์„œ ์ค‘๋‹จ์ (main+8)์˜ ๊ฒฐ๊ณผ๋กœ rax์—๋Š” ๋ฆฌ๋ˆ…์Šค๊ฐ€ ์ƒ์„ฑํ•œ ๋žœ๋ค ๊ฐ’์ด ์ €์žฅ๋จ!!
๊ทผ๋ฐ ์ด ํ™˜๊ฒฝ์—์„  ์ปค์Šคํ…€๋งˆ์ด์ง•์ด ์ž˜ ์•ˆ๋ผ์„œ.. ๋‹ค์‹œ ์นผ๋ฆฌ๋กœ


์ฝ”๋“œ ์‹คํ–‰ ์‹œ rax์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒซ ๋ฐ”์ดํŠธ๊ฐ€ null์ธ 8byte ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋จ


์ƒ์„ฑ๋œ ๋žœ๋ค ๊ฐ’์€ main+17์—์„œ reb-0x8์— ์ €์žฅ๋จ


๐Ÿšจfs๋ž€?

 ์ด์ „ ์ •๋ฆฌ ์ž๋ฃŒ์—์„œ CPU์—๋Š” ๋‹ค์–‘ํ•œ ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค.
์ดˆ๊ธฐ์—” ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋กœ code, data, extra(cs/ds/es)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ CPU๊ฐœ๋ฐœ์ž๋“ค์€ ์—ฌ๊ธฐ์— ๋‘ ๊ฐœ ๋” ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์–ด์„œ ์ด๋ฆ„ ๊ณ ๋ฏผํ•˜๋‹ค ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋Œ€๋กœ..


 ์ด์ „ cs, ds, es๋Š” CPU๊ฐ€ ์‚ฌ์šฉ ๋ชฉ์ ์„ ๋ช…์‹œํ•œ ๋ ˆ์ง€์Šคํ„ฐ์ธ ๋ฐ˜๋ฉด, fs์™€ gs๋Š” ๋ชฉ์  ์ง€์ • X
์ฆ‰, OS๊ฐ€ ์ž„์˜๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ ˆ์ง€์Šคํ„ฐ์ž…๋‹ˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค๋Š” fs๋ฅผ TLS๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ!
Thread Local Storage(TLS)๋Š” ์นด๋‚˜๋ฆฌ ๋น„๋กฏํ•œ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์ €์žฅ
์ฆ‰, ์Šค๋ ˆ๋“œ๋ณ„ ์ €์žฅ๊ณต๊ฐ„..


์นด๋‚˜๋ฆฌ ๊ฒ€์‚ฌ

์ด์ œ ์ถ”๊ฐ€๋œ ์—ํ•„๋กœ๊ทธ์˜ ์ฝ”๋“œ์— ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•˜๊ณ  ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๊ณ„์† ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ๋Š” 16๊ฐœ์˜ H๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์นด๋‚˜๋ฆฌ๋ฅผ ๋ณ€์กฐํ•˜๊ณ , ์‹คํ–‰ ํ๋ฆ„์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

main+50์€ rbp-8์— ์ €์žฅํ•œ ์นด๋‚˜๋ฆฌ๋ฅผ rcx๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค.
๊ทธ ๋’ค, main+54์—์„œ rcx๋ฅผ fs:0x28์— ์ €์žฅ๋œ ์นด๋‚˜๋ฆฌ์™€ xor
๋‘ ๊ฐ’์ด ๋™์ผํ•˜๋ฉด ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ 0์ด ๋˜๋ฉด์„œ
je์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ฒŒ ๋˜๊ณ , mainํ•จ์ˆ˜๋Š” ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.


๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๊ฐ’์ด ๋™์ผํ•˜์ง€ ์•Š์œผ๋ฉด __stack_chk_fail์ด ํ˜ธ์ถœ๋˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.


์ฝ”๋“œ๋ฅผ ํ•œ ์ค„ ์‹คํ–‰์‹œํ‚ค๋ฉด, rbp-0x8์— ์ €์žฅ๋œ ์นด๋‚˜๋ฆฌ ๊ฐ’์ด ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ์ธํ•ด
“0x4848484848484848”์ด ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทผ๋ฐ ์ „ ์ €๋ ‡๊ฒŒ ์•ˆ ๋‚˜์™€์„œ.. ๋Œ€์ฒด ์ด๋ฏธ์ง€๋กœ ๋„ฃ์„๊ฒŒ์š” ์ˆ˜์ •์€ ๊ท€์ฐฎ์•„์„œ ใ…Ž
๋ฐ‘์— ์ด๋ฏธ์ง€๋„ ๋น„์Šทํ•œ ์ด์œ ๋กœ ๋Œ€์ฒด ์ด๋ฏธ์ง€๋กœ.. ใ… 


main+54์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ 0์ด ์•„๋‹ˆ๋ฏ€๋กœ main+63์—์„œ main+70์œผ๋กœ ๋ถ„๊ธฐํ•˜์ง€ ์•Š๊ณ  
main+65์˜ __stack_chk_fail์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


์ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.


์นด๋‚˜๋ฆฌ ์ƒ์„ฑ ๊ณผ์ •๐Ÿ”ฌ

์นด๋‚˜๋ฆฌ ๊ฐ’์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ, TLS์— ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ €์žฅ๋˜๊ณ , ๊ฐ ํ•จ์ˆ˜๋งˆ๋‹ค
ํ”„๋กค๋กœ๊ทธ์™€ ์—ํ•„๋กœ๊ทธ์—์„œ ์ด ๊ฐ’์„ ์ฐธ์กฐํ•˜๋ฉฐ, ์ข€ ๊นŠ์ด ๋“ค์–ด๊ฐ€ TLS์— ์นด๋‚˜๋ฆฌ ๊ฐ’ ์ €์žฅ์„ ์•Œ์•„๋ณด์ฃ 

  • ํ”„๋กค๋กœ๊ทธ : ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ์‹œ, ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •
  • ์—ํ•„๋กœ๊ทธ : ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์†Œ๋ฉธ์‹œํ‚ค๋Š” ๊ณผ์ •, leave ๋ช…๋ น์–ด์™€ ret ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•จ

TLS ์ฃผ์†Œ ํŒŒ์•…

fs๋Š” TLS๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ fs์˜ ๊ฐ’์„ ์•Œ๋ฉด TLS์˜ ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ
๊ทธ๋Ÿฌ๋‚˜ ๋ฆฌ๋ˆ…์Šค์—์„œ fs์˜ ๊ฐ’์€ ํŠน์ • ์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ ์กฐํšŒ๋‚˜ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜์ฃ 
gdb์—์„œ ๋‹ค๋ฅธ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋“ฏ info register fs๋‚˜ print $fs์™€ ๊ฐ™์€ ๋ฐฉ์‹์€ ์•ˆ๋จ!

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์„  fs์˜ ๊ฐ’์„ ์„ค์ •ํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” arch_prctl(int code, unsigned long addr)
์‹œ์Šคํ…œ ์ฝœ์— ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•˜์—ฌ fs๊ฐ€ ์–ด๋–ค ๊ฐ’์„ ์„ค์ •๋˜๋Š”์ง€ ์กฐ์‚ฌํ•ฉ์‹œ๋‹ค.
์ด ์‹œ์Šคํ…œ ์ฝœ์„ arch_prctl(ARCH_SET_FS, addr)์˜ ํ˜•ํƒœ๋กœ ํ˜ธ์ถœํ•˜๋ฉด fs์˜ ๊ฐ’์€ addr๋กœ ์„ค์ •๋จ!

์ฐธ๊ณ ๋กœ arch_prctl์— ๋Œ€ํ•˜์—ฌ ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์œผ๋ฉด ์—ฌ๊ธฐ๋กœ

catch : gdb์— ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ ์‹œ, ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€์‹œํ‚ค๋Š” ๋ช…๋ น์–ด

 

์ด ๋ช…๋ น์–ด๋กœ arch_prctl์— catchpoint๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ค์Šต์— ์‚ฌ์šฉํ–ˆ๋˜ canary๋ฅผ ์‹คํ–‰ํ•ฉ์‹œ๋‹ค


catchpoint์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ, rdi์˜ ๊ฐ’์ด 0x1002์ธ๋ฐ ์ด ๊ฐ’์€ ARCH_SET_FS์˜ ์ƒ์ˆซ๊ฐ’์ด์ฃ 
rsi์˜ ๊ฐ’์ด 0x7ffff7fb1580์ด๋ฏ€๋กœ, ์ด ํ”„๋กœ์„ธ์Šค๋Š” TLS 0x7ffff7fb1580์— ์ €์žฅ → fs์— ๊ฐ€๋ฆฌํ‚ด

์นด๋‚˜๋ฆฌ๊ฐ€ ์ €์žฅ๋  fs+0x28(0x7ffff7fb1580+0x28)์˜ ๊ฐ’์„ ๋ณด๋ฉด, ์•„์ง ์–ด๋–ค ๊ฐ’๋„ ์„ค์ •์ด ์•ˆ๋˜์–ด์žˆ๋„ค์š” 


์นด๋‚˜๋ฆฌ ๊ฐ’ ์„ค์ •๐Ÿ› 

watch : ํŠน์ • ์ฃผ์†Œ์— ์ €์žฅ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๋Š” ๋ช…๋ น์–ด

TLS์˜ ์ฃผ์†Œ๋ฅผ ์•Œ์•˜์œผ๋ฏ€๋กœ, gdb์˜ watch ๋ช…๋ น์–ด๋กœ TLS+0x28์— ๊ฐ’์„ ์“ธ ๋•Œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘๋‹จํ•˜์ฃ 


watchpoint๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ณ„์† ์ง„ํ–‰์‹œํ‚ค๋ฉด Security_initํ•จ์ˆ˜์—์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉˆ์ถฐ์š”
๊ทผ๋ฐ ์ €๋Š” Security_initํ•จ์ˆ˜๊ฐ€ ์•ˆ ๋ณด์ด๋„ค์š” ์ €๊ฑฐ Contiune ํ•œ๋ฒˆ ๋” ํ•œ ๊ฑด๋ฐ๋„..


์—ฌ๊ธฐ์„œ TLS+0x28์˜ ๊ฐ’์„ ์กฐํšŒํ•˜๋ฉด 0xe15de3b266156800 ์ด ์นด๋‚˜๋ฆฌ๋กœ ์„ค์ •๋œ ๊ฑธ ํ™•์ธํ–ˆ์ฃ 

์‹ค์ œ๋กœ ์ด ๊ฐ’์ด mainํ•จ์ˆ˜์— ์‚ฌ์šฉ๋˜๋Š” ์นด๋‚˜๋ฆฌ๊ฐ’์ด์ง€ ํ™•์ธ ํ•ด๋ณผ๊นŒ์š”?


mov rax,QWORD PTR fs:0x28๋ฅผ ์‹คํ–‰ํ•˜๊ณ  rax ๊ฐ’์„ ํ™•์ธํ•ด๋ณด๋ฉด
security_init์—์„œ ์„ค์ •ํ•œ ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!!


์นด๋‚˜๋ฆฌ ์šฐํšŒ

์นด๋‚˜๋ฆฌ๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด ๋‹น์—ฐํžˆ ์šฐํšŒ ๋ฐฉ๋ฒ•๋„ ์—ฐ๊ตฌ๋ฅผ ํ–ˆ๊ฒ ์ฃ  ์šฐํšŒ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…(Brute Force)
 x64 ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” 8๋ฐ”์ดํŠธ์˜ ์นด๋‚˜๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, x86 ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” 4๋ฐ”์ดํŠธ์˜ ์นด๋‚˜๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นด๋‚˜๋ฆฌ์—๋Š” NULL ๋ฐ”์ดํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์‹ค์ œ๋กœ๋Š” 7๋ฐ”์ดํŠธ์™€ 3๋ฐ”์ดํŠธ์˜ ๋žœ๋คํ•œ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

 ์ฆ‰, ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์œผ๋กœ x64 ์•„ํ‚คํ…์ฒ˜์˜ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์•Œ์•„๋‚ด๋ ค๋ฉด ์ตœ๋Œ€ 256^7๋ฒˆ, x86 ์—์„œ๋Š” ์ตœ๋Œ€ 256^3 ๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ๋Ÿ‰์ด ๋งŽ์•„์„œ x64 ์•„ํ‚คํ…์ฒ˜์˜ ์นด๋‚˜๋ฆฌ๋Š” ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์œผ๋กœ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ํ˜„์‹ค์ ์œผ๋กœ ์–ด๋ ค์šฐ๋ฉฐ, x86 ์•„ํ‚คํ…์ฒ˜๋Š” ๊ตฌํ•  ์ˆœ ์žˆ์ง€๋งŒ, ์‹ค์ œ ์„œ๋ฒ„๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ €์ •๋„ ํšŸ์ˆ˜์˜ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

TLS ์ ‘๊ทผ
 ์นด๋‚˜๋ฆฌ๋Š” TLS์— ์ „์—ญ๋ณ€์ˆ˜๋กœ ์ €์žฅ๋˜๋ฉฐ, ๋งค ํ•จ์ˆ˜๋งˆ๋‹ค ์ด๋ฅผ ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. TLS์˜ ์ฃผ์†Œ๋Š” ๋งค ์‹คํ–‰๋งˆ๋‹ค ๋ฐ”๋€Œ์ง€๋งŒ ๋งŒ์•ฝ ์‹คํ–‰์ค‘์— TLS์˜ ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ž„์˜ ์ฃผ์†Œ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด TLS์— ์„ค์ •๋œ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜, ์ด๋ฅผ ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 ๊ทธ ๋’ค, ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์•Œ์•„๋‚ธ ์นด๋‚˜๋ฆฌ ๊ฐ’ ๋˜๋Š” ์กฐ์ž‘ํ•œ ์นด๋‚˜๋ฆฌ ๊ฐ’์œผ๋กœ ์Šคํƒ ์นด๋‚˜๋ฆฌ๋ฅผ ๋ฎ์œผ๋ฉด ํ•จ์ˆ˜์˜ ์—ํ•„๋กœ๊ทธ์— ์žˆ๋Š” ์นด๋‚˜๋ฆฌ ๊ฒ€์‚ฌ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํƒ ์นด๋‚˜๋ฆฌ ๋ฆญ

์Šคํƒ ์นด๋‚˜๋ฆฌ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ์ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ์ด์šฉํ•ด ์นด๋‚˜๋ฆฌ ๊ฒ€์‚ฌ ์šฐํšŒ ๊ฐ€๋Šฅ!!

// Name: bypass_canary.c
// Compile: gcc -o bypass_canary bypass_canary.c
 
#include <stdio.h>
#include <unistd.h>
 
int main() {
  char memo[8];
  char name[8];
 
  printf("name : ");
  read(0, name, 64);
  printf("hello %s\n", name);
 
  printf("memo : ");
  read(0, memo, 64);
  printf("memo %s\n", memo);
  return 0;
}

์ฒซ๋ฒˆ์งธ ์ž…๋ ฅ์—์„œ BOF๋ฅผ ์‹œ์ผœ์„œ ์นด๋‚˜๋ฆฌ์˜ ๊ฐ’์„ ์–ป์–ด๋‚ด๊ณ ,
BOF์˜ ๊ฐ’์ด ์นด๋‚˜๋ฆฌ๊ฐ’์ด ๋ฆญ์ด ๋˜๊ณ , ์–ป์–ด๋‚ธ ๊ฐ’์„ ํ™œ์šฉํ•ด ๊ฒ€์‚ฌ๋ฅผ ์šฐํšŒํ•จ

์Šคํƒ ์นด๋‚˜๋ฆฌ ์ทจ์•ฝ์  ํ™œ์šฉ ๋ชจ์Šต

์ง์ ‘ ๋˜ ์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ, ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ.. ๋„ˆ๋ฌด ํž˜๋“ค์–ด์š” ใ… 
์–ด์งœํ”ผ ๋ฌธ์ œ ํ’€๋ฉด์„œ ๋˜ ํ• ๊ฑฐ ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€!!


์ฝ”์Šค ์š”์•ฝ ๐Ÿ“

 

์นด๋‚˜๋ฆฌ

ํ•จ์ˆ˜ ์‹œ์ž‘ ์‹œ ์Šคํƒ ๋ฒ„ํผ์™€ Return Address ์‚ฌ์ด์— ๋žœ๋ค ๊ฐ’์„ ์‚ฝ์ž…ํ•œ ํ›„ ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ
ํ•ด๋‹น ๋žœ๋ค ๊ฐ’์˜ ๋ณ€์กฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์˜ค์—ผ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ณดํ˜ธ ๊ธฐ๋ฒ•

์นด๋‚˜๋ฆฌ ์ƒ์„ฑ

security_initํ•จ์ˆ˜์—์„œ TLB์— ๋žœ๋ค ๊ฐ’์œผ๋กœ ์นด๋‚˜๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋ฉด, ๋งค ํ•จ์ˆ˜์—์„œ ์ด๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉ

์นด๋‚˜๋ฆฌ ์šฐํšŒ ๊ธฐ๋ฒ•

  • ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ(Brute Force Attack):
     - ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์œผ๋กœ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•. ํ˜„์‹ค์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.
  • TLS ์ ‘๊ทผ:
     - ์นด๋‚˜๋ฆฌ๋Š” TLS์— ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ €์žฅ๋˜๋ฏ€๋กœ, ์ด ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์นด๋‚˜๋ฆฌ๋ฅผ ์šฐํšŒ
  • ์Šคํƒ ์นด๋‚˜๋ฆฌ ๋ฆญ:
    - ํ•จ์ˆ˜์˜ ํ”„๋กค๋กœ๊ทธ์—์„œ ์Šคํƒ์— ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์ €์žฅํ•˜๋ฏ€๋กœ, ์ด๋ฅผ ์ฝ์–ด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉด ์นด๋‚˜๋ฆฌ๋ฅผ ์šฐํšŒ
    - ๊ฐ€์žฅ ํ˜„์‹ค์ ์ธ ์นด๋‚˜๋ฆฌ ์šฐํšŒ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

 

Mitigation: Stack Canary

์ด๋ฒˆ ์ฝ”์Šค์—์„œ๋Š” ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์Šคํƒ ์นด๋‚˜๋ฆฌ(Stack Canary)์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

dreamhack.io

๋”๋ณด๊ธฐ
 

[์ž ๊น๊ณผํ•™]๊ด‘๋ถ€๋ฅผ ๊ตฌํ•œ ์ƒ๋ช…์˜ ์ง€์ €๊ท ํƒ„๊ด‘์˜ ์นด๋‚˜๋ฆฌ์•„

๋ฏธ๊ตญ ๊ด‘์‚ฐ๊ตญ ์ œ๊ณต‘ํƒ„๊ด‘์˜ ์นด๋‚˜๋ฆฌ์•„’๋Š”๋‹ค๊ฐ€์˜จ ์œ„ํ—˜์„ ๋จผ์ € ์•Œ๋ ค์ฃผ๋Š” ๋Œ€์ƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ง์ž…๋‹ˆ๋‹ค. ํƒ„๊ด‘์—์„œ ๋‚˜์˜ค๋Š” ์œ ๋… ๊ฐ€์Šค์— ์ฃฝ๊ฑฐ๋‚˜ ๋‹ค์น˜๋Š” ์ผ์„ ํ”ผํ•˜๊ณ ์ž ๊ด‘๋ถ€๋“ค์ด ์œ ๋… ๊ฐ€์Šค์— ๋ฏผ๊ฐํ•œ ์นด

www.dongascience.com:443

 

Thread-local storage - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Thread-local storage (TLS) is a computer programming method that uses static or global memory local to a thread. While the use of global variables is generally discouraged in modern pr

en.wikipedia.org

 

 

Thread Local Storage

Thread Local Storage ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋‹ค๋ณด๋ฉด ๋ถˆํŽธํ•œ๊ฒŒ ์žˆ๋‹ค. ์“ฐ๋ ˆ๋“œ๋ณ„ ๊ณ ์œ ํ•œ ์ „์—ญ๋ณ€์ˆ˜(๋˜๋Š” ์ •์ ๋ณ€์ˆ˜) ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ. ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ทธ๋ƒฅ ๋งŒ๋“ค๋ฉด ์“ฐ๋ ˆ๋“œ์—๊ฒŒ ์ฃผ์–ด์ง„ ํ˜ผ์ž๋งŒ์˜ ๊ณต

ozt88.tistory.com

 

์ฐธ๊ณ  ์ด๋ฏธ์ง€

 

Mitigation: Stack Canary

์ด๋ฒˆ ์ฝ”์Šค์—์„œ๋Š” ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์Šคํƒ ์นด๋‚˜๋ฆฌ(Stack Canary)์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

dreamhack.io