GCC Stack Smashing Protector

๋ฐ˜์‘ํ˜•

C ์ปดํŒŒ์ผ๋Ÿฌ์—๋Š” ๊ต‰์žฅํžˆ ์ข…๋ฅ˜๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. Dev C Compiler, Visual C Compiler, GNU C Compiler .... ๋ญ ๊ทธ ์™ธ์—๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€์š”?


์˜ค๋Š˜์€ Buffer Overflow๋ผ๋Š” ๊ฒƒ์„ ์ฃผ์ œ๋กœ ์‹œ์ž‘ํ•˜์—ฌ, GNU C Compiler์— ์กด์žฌํ•˜๋Š” Stack Smashing Protector๊ฐ€ ์–ด๋–ค ๊ฒƒ์ธ์ง€๋ฅผ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.




์ž, ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์ œ๊ฐ€ ์ž‘์„ฑ์„ ํ•ด์„œ ์ด๋ ‡๊ฒŒ ์ž…๋ ฅ์„ ๋ฐ›๊ณ  ๋‚ฌ๋”๋‹ˆ, ์œ„์™€ ๊ฐ™์ด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฟœ์–ด๋ƒ…๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”? ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.





์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ๋ถ„์„ํ•ด๋ด…์‹œ๋‹ค. ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ, 1๊ฐœ์˜ ๊ณต๊ฐ„์„ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๊ธด ํ–ˆ์ง€๋งŒ, i ์˜ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด, ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(?) ๊ทธ๋ฆฌ๊ณ , fibonacci ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์จ์„œ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š”๊ตฐ์š”. ์ž ์—ฌ๊ธฐ์„œ ์–ด๋–ค ๋ถ€๋ถ„์ด ๋ฌธ์ œ์ผ๊นŒ์š”?


๋ฐ”๋กœ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช… 1๊ฐœ์˜ ๊ณต๊ฐ„์„ ๋ถ€์—ฌํ–ˆ์ง€๋งŒ, ๋งŒ์•ฝ 3๊ฐœ ์ด์ƒ์˜ ๊ณต๊ฐ„์„ ๋ถ€์—ฌํ•˜์—ฌ, ์ˆซ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›๊ฒŒ ๋˜๋ฉด, Overflow๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ GCC ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋Š” *** stack smashing detected *** ๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. 



BOF(Buffer OverFlow)

์‹œ์Šคํ…œ ๋ณด์•ˆ์ด๋‚˜, ์ด์ œ ๋ง‰ ํ”„๋กœ๊ทธ๋žจ ์ทจ์•ฝ์ ์„ ๋ถ„์„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๋ผ๋ฉด, ์ด๋Ÿฐ ๋‹จ์–ด๋Š” ๊ทธ๋ƒฅ ๊ธฐ์ดˆ์ ์ธ ๋‹จ์–ด์— ๋ถˆ๊ณผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋Š” ์ปดํ“จํ„ฐ ๊ณผํ•™ ์ „๊ณต์ž๋“ค์ด๋ผ๋ฉด, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„์—๋„ ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ ์ทจ์•ฝ์ ์˜ ์ผ์ข…์ด๋‹ค.


๊ทธ๋ฆผ์œผ๋กœ ํ•œ ๋ฒˆ ์„ค๋ช…ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.




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


๊ฐ๊ฐ์˜ ์˜์—ญ์„ ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


Code Area : ์ด ๊ณต๊ฐ„์—๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ง์ ‘ ์ง  C ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๋ช…๋ น์–ด ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

Data Area : ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

Heap Area : ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. C๋‚˜ C++๋ฅผ ํ†ตํ•ด malloc ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ์˜์—ญ์— ๋“ค์–ด์˜ต๋‹ˆ๋‹ค.

Stack Area : ํ•จ์ˆ˜ ์ธ์ž, ์ง€์—ญ ๋ณ€์ˆ˜๋“ค์ด ์ด ๊ณต๊ฐ„์— ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. 


์ž ์กฐ๊ธˆ ์ดํ•ด๊ฐ€ ๋˜์…จ๋Š”์ง€์š”?

๊ฐ„๋‹จํ•˜๊ฒŒ ๋ถ€๊ฐ€์ ์ธ ์„ค๋ช…์€ ์›ฌ๋งŒํ•ด์„œ ์ œ์™ธํ•˜๊ณ , ์ฝ”๋”ฉ์„ ํ•  ๋•Œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ถ€๋ถ„๋“ค๋งŒ ์„ค๋ช…ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. 


์—ฌ๊ธฐ์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ผ๋Š” ๊ฒƒ์€ ์ฝ”๋“œ ์˜์—ญ ์•ˆ์—์„œ ์ •ํ•ด์ค€ ๊ณต๊ฐ„์„ ์ง€๋‚˜์น˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ, ๋‹ค๋ฅธ ๊ณต๊ฐ„์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ถœ๋ ฅ๋˜๋Š” ๊ฐ’์€ ์“ฐ๋ ˆ๊ธฐ๊ฐ’ (์ž˜๋ชป๋œ ๊ฐ’)์ด ์ถœ๋ ฅ๋  ์ˆ˜๋„ ์žˆ๊ณ , ํ•ด์ปค๋“ค์ด๋‚˜ ๊ณต๊ฒฉ์ž๋“ค์—๊ฒŒ ์ด ๋ถ€๋ถ„์ด ๋…ธ์ถœ๋˜๋ฉด, ๋ณด์•ˆ์ƒ์˜ ๊ฒฐํ•จ์„ ์ถ”๊ฐ€๋กœ ๋…ธ์ถœ์‹œํ‚ค๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.


์˜ˆ์‹œ๋กœ ๋ฐฉ๊ธˆ ์œ„์— ์žˆ๋˜ ์ฝ”๋“œ์—์„œ arr ๋ฐฐ์—ด์ด ๋ฐ์ดํ„ฐ ์˜์—ญ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐ„์€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š์€ ๊ฐ€๋ณ€ ๋ฐฐ์—ด ๋ณ€์ˆ˜๋กœ, ์ดˆ๊ธฐํ™” ์‹œํ‚จ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ํ†ตํ•ด ์Šคํƒ ์˜์—ญ์—์„œ๋Š” NULL ๊ฐ’์„ ํฌํ•จํ•˜์—ฌ ์ตœ์†Œ 2~3๊ฐœ์˜ ๊ณต๊ฐ„์„ ๋งŒ๋“ค์–ด๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋งŒ์•ฝ i ๋ณ€์ˆ˜์—์„œ 3๊ฐœ ์ด์ƒ์˜ ๊ณต๊ฐ„์„ ๋งˆ๋ จํ•˜์—ฌ ์ž…๋ ฅ ๊ฐ’์„ ๊ทธ ์ด์ƒ ๋ฐ›์•˜๋‹ค๋ฉด? ๋‹น์—ฐํžˆ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ๊ณต๊ฐ„์— ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๋Œ€ํ‘œ์ ์ธ ํ•จ์ˆ˜๋กœ๋Š” ์œ„์— ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋œ scanf ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ž…๋‹ˆ๋‹ค.


์‹ค์ œ๋กœ Visual C++ 2010 ์ปดํŒŒ์ผ๋Ÿฌ ์ด์ƒ์—์„œ๋Š” scanf์˜ ์‚ฌ์šฉ์„ ์ œํ•œํ•˜๊ณ  ์žˆ๊ณ , scanf๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์—๋Ÿฌ๋ฅผ ๋ฟœ์–ด๋‚ด๋ฉฐ, ํŠน์ • ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ๋งŒ ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MS์—์„œ๋Š” ์ด ํ•จ์ˆ˜ ๋Œ€์‹ , ์ž์ฒด์ ์œผ๋กœ ๋งŒ๋“  scanf_s ์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๊ณ , scanf์™€์˜ ์ฐจ์ด์ ์€ ๋ฌธ์ž์—ด์ด๋‚˜ ๋ฌธ์ž ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ, ๊ณต๊ฐ„์„ ์ง์ ‘ ์ •ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.



์œ„์™€ ๊ฐ™์ด Visual C++์—์„œ๋Š” scanf ์‚ฌ์šฉ์„ ์ œํ•œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. scanf ๋Œ€์‹  scanf_s์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์‚ฌํ•ญ์€ char ์ž๋ฃŒํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ์ œํ•œํ•˜๊ณ  ์žˆ๋Š” ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.


๋ฐ˜๋Œ€๋กœ, GNU C Compiler์˜ ๊ฒฝ์šฐ์—๋Š” scanf_s๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. scanf ์‚ฌ์šฉ ์ œํ•œ์„ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ(์•„๊นŒ ์œ„์—์„œ ๋ดค๋˜ ๊ฒƒ์ฒ˜๋Ÿผ Overflow๊ฐ€ ๋ฐœ์ƒ), stack smashing์ด ๋ณดํ˜ธํ•˜์˜€๋‹ค๋Š” ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์˜ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


์ •ํ™•ํ•˜๊ฒŒ ์–ด๋–ค ๋ถ€๋ถ„์—์„œ Stack Smashing Protector๊ฐ€ ๋‚˜๋Š”์ง€๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด, GCC์—์„œ Stack Smashing Protector๋ฅผ ๊ฐ•์ œ ์˜ต์…˜์œผ๋กœ ์ฃผ์–ด, ์ปดํŒŒ์ผ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


gcc -fstack-protector -S Source.c


์ด์ œ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.



fibonacci ํ•จ์ˆ˜์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”...



์—ฌ๊ธฐ๋„ ๋ณ„ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€....



scanf๋ฅผ call ํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋„ Stack Smashing Protector๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ถ€๋ถ„์€ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ๋„๋Œ€์ฒด ์–ด๋””์„œ ๋™์ž‘ํ•˜๋Š”๊ฑด์ง€...


์ •ํ™•ํ•œ ๋ถ„์„์„ ์œ„ํ•ด์„œ, GDB๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ถ„์„์„ ๋‹ค์‹œ ์‹œ๋„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.




GDB๋ฅผ ์‚ฌ์šฉํ•ด์„œ, ๋ฐ˜๋ณต๋ฌธ ๊ตฌ๊ฐ„์— Breakpoint๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.




์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ, 0x400778 ๊ตฌ๊ฐ„์— __stack_chk_fail ๋ถ€๋ถ„์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. __stack_chk_fail ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, GCC ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ Stack Smashing Protector๋ฅผ ๋™์ž‘์‹œํ‚จ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ๊ฐ„์€ stack canary check์— ์‹คํŒจํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด, ์ด ํ”„๋กœ์‹œ์ €๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”๊ฑธ๊นŒ์š”?


๋ณดํ†ต, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•จ์ˆ˜์— ์ง„์ž…์‹œ, return address์™€ frame pointer ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ƒฅ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉด, ๋””๋ฒ„๊น…์‹œ, return ์ฃผ์†Ÿ๊ฐ’์„ ๋ณ€์กฐํ•˜์—ฌ ์ทจ์•ฝ์ ์„ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


Stack Smashing Protector๋Š” ์ด ๋ณ€์กฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ๋ฉ”๋ชจ๋ฆฌ์— canary๋ผ๊ณ  ํ•˜๋Š” ํŠน์ • ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ณ , ํ•จ์ˆ˜์—์„œ ๋ฆฌํ„ดํ–ˆ์„ ๋•Œ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒ˜์Œ ํ•จ์ˆ˜์— ์ง„์ž…ํ–ˆ์„ ๋•Œ return address์™€ ์ผ์น˜/๋ถˆ์ผ์น˜๋ฅผ ๊ฒ€์ฆ์„ ํ•ฉ๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด, Cookie๋ž‘ ๊ฑฐ์˜ ๋น„์Šทํ•œ ๊ฐœ๋…์ด์ง€์š”.


์ด๋ ‡๊ฒŒ ๋  ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๋Š” canary ๊ฐ’์„ ๋ณ€์กฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์— canary ๊ฐ’์„ ๋ณ€์กฐ๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, Overflow๊ฐ€ ์ƒ๊ฒผ๋Š”์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์ž…์ฆ๋ฉ๋‹ˆ๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด, canary ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?


์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ, ๊ทธ ์ค‘์—์„œ๋„ ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Ubuntu Linux์—์„œ๋Š” OTP์ฒ˜๋Ÿผ ํ˜„์žฌ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ํ•˜์œ„ ๋ฐ”์ดํŠธ๋ฅผ ํ•ญ์ƒ 0์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ Random + terminator canary ํ˜•ํƒœ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


์ด๋ ‡๊ฒŒ ๋  ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๊ฐ€ ์•„๋ฌด๋ฆฌ canary ๊ฐ’์„ ๋šœ๋“ค๊ธฐ๋ ค ํ•ด๋„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฐ•์ ์ด ์ƒ๊น๋‹ˆ๋‹ค. ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ๋˜๋Š” Random์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์ผ์ผ์ด ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์œ ์ถ”ํ•˜๊ธฐ๋„ ์–ด๋ ต๊ณ , terminator์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋„ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์—ด ์—ฐ์‚ฐ ๊ฐ€์ง€๊ณ ๋Š” ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์˜ ๋๊ฐ’์€ NULL์ด๋ผ๊ณ  ํ•˜๋Š” \0, \n, -1 ๊ฐ’์— ํ•ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ง€์š”..


๋‹ค์‹œ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒŒ ๋˜๋ฉด, ์ด ์ฝ”๋“œ์—์„œ๋Š” gs ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต ํ•จ์ˆ˜์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด, canary ๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด gs ๋ ˆ์ง€์Šคํ„ฐ์— ์ผ์ • ๊ณต๊ฐ„์„ ๋‚จ๊ฒจ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ํฌ์ŠคํŠธ์˜ ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— canary ๊ฐ’์€ __stack_chk_guard๋ผ๋Š” ์ „์—ญ ๋ณ€์ˆ˜์— canary ๊ฐ’์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.


Linux Kernel์„ ์ปดํŒŒ์ผ ํ•  ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 



__stack_chk_fail ํ•จ์ˆ˜๋Š” Kernel์—์„œ๋„ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด, ํŒจ๋‹‰์„ ์ผ์œผํ‚ต๋‹ˆ๋‹ค. ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ทจ์•ฝ์ ์€ ๊ต‰์žฅํžˆ ๊ธฐ์ดˆ์ ์ด๋ฉด์„œ๋„ ์ทจ์•ฝ์ ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋„์—์„œ๋„ panic ์ˆ˜์ค€๊ธ‰์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.




์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋”ฉํ•˜๋‹ค ์ƒ๊ธด ์˜ค๋ฅ˜๋Š” ์œ„์™€ ๊ฐ™์ด fortify_fail ํ˜•ํƒœ์˜ ์—๋Ÿฌ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.




ํ•ด๋‹น ์ดํ›„์— ๋‚˜ํƒ€๋‚˜๋Š” ๋ฉ”์‹œ์ง€๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. 



์—ฌ๊ธฐ๊นŒ์ง€, Stack Smashing Protector์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๊ธด ๋‚ด์šฉ์ด๊ณ , ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ C์–ธ์–ด์™€ ๊ฐ™์€ Low ๋ ˆ๋ฒจ์˜ ์–ธ์–ด๋ฅผ ๊ณต๋ถ€ํ•˜์‹ค ๋•Œ๋Š” ์ด๋Ÿฐ ๋ถ€๋ถ„๋“ค์ด ๊ต‰์žฅํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ํฌ์ธํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ ๋Š๋ผ์‹ค์ง€๋„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์‚ฌ์†Œํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ–ˆ๋˜ ๋ถ€๋ถ„์ด ์ž˜๋ชปํ•ด์„œ ์ทจ์•ฝ์ ์ด ์ƒ๊ธฐ๊ธฐ๋„ ํ•˜๊ณ , ํŠนํžˆ ์šด์˜์ฒด์ œ๋‚˜ ์ž„๋ฒ ๋””๋“œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ๊ฟˆ๊พธ์‹œ๋Š” ๋ถ„๋“ค์ด๋ผ๋ฉด, ๊ณ ๋ คํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋ณดํ†ต Windows์—์„œ ์‚ฌ์šฉ๋˜๋Š” Visual C ์ปดํŒŒ์ผ๋Ÿฌ๋„ ์ด ์ •๋„๊นŒ์ง€๋Š” ๊ฐ€์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Windows์—์„œ๋Š” ASLR(Address Space Layout Randomization)์ด๋ผ๋Š” ๊ธฐ์ˆ ์„ Windows Kernel 6.0 (Windows Vista)์—์„œ ์ฑ„ํƒํ•˜์˜€์œผ๋ฉฐ, ์ด ๊ธฐ์ˆ  ๋˜ํ•œ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.


Stack Smashing Protector๋Š” 2007๋…„๋„ GCC์—์„œ ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ์œผ๋ฉฐ, Mac OS X (Apple Inc.) ๋˜ํ•œ ์ด ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  Linux์™€๋Š” ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์ธ๋‹ค๊ณ  ํ•˜๋‹ˆ, Apple Open Source Page์—์„œ ํ•œ ๋ฒˆ ํ™•์ธํ•ด๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments