stack buffer overflow ์ทจ์•ฝ์ 

stack buffer overflow

๋ง ๊ทธ๋Œ€๋กœ ์Šคํƒ์ด ํ˜๋Ÿฌ๋„˜์น˜๋Š” ์ƒํ™ฉ์„ ์ง€์นญํ•œ๋‹ค.
๋งŒ๋งŒํ•œ ์ทจ์•ฝ์ ์ด๋ผ์„œ ์˜ค๋žซ๋™์•ˆ ๊ณต๊ฒฉ์˜ ๋Œ€์ƒ์ด ๋˜์–ด์™”๊ณ , ์ง€๊ธˆ๋„ ์ข…์ข… ์ทจ์•ฝ์  ๋ณด๊ณ ๊ฐ€ ๋‚˜์˜จ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ๋ฒ„ํผ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘์–ด๋„ฃ์—ˆ์„๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋”์ฐํ•œ UB๋ฅผ ์ด์šฉํ•˜๋Š” ์ทจ์•ฝ์ ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
C/C++ ๊ฐ™์€ unsafeํ•œ ์–ธ์–ด๋ฅผ ์“ธ๋•Œ ์ฃผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค...

์•„๋ž˜ ์ฝ”๋“œ๋Š” ํ•ด๋‹น ์ทจ์•ฝ์ ์„ ๊ฐ–๊ณ ์žˆ๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๋‹ค.

#include <string.h>


void foo(char bar)
{
** char buffer[12];
*


** strcpy(c, bar); // no bounds checking**
}


int main(int argc, char argv)
{
** foo(argv[1]);

** return 0;**
}

strcpy๋Š” ๋ฐ”์šด๋“œ์ฒดํฌ ์—†์ด ๋ฌด์‹ํ•˜๊ฒŒ ๋ฌธ์ž์—ด์„ ๋ณต์‚ฌํ•ด๋„ฃ๋Š” ํ•จ์ˆ˜๋ผ์„œ, ๋ช…๋ นํ–‰ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 12๊ธ€์ž ์ด์ƒ์ผ ๊ฒฝ์šฐ์—๋Š” ์˜ค๋™์ž‘ํ•œ๋‹ค.

๋ฌธ์ œ๋Š” ์ € buffer๋ผ๋Š” ๋ฐฐ์—ด ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ๋Š” ๊ตฌ๊ฐ„๊นŒ์ง€ write๋ฅผ ํ•ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ†ต์ƒ์ ์œผ๋กœ ์ง€์—ญ๋ณ€์ˆ˜๋“ค์€ ์ธ์ ‘ํ•œ ์ฃผ์†Œ ์œ„์น˜์— ๋ชฐ๋ ค์žˆ๋Š” ํŽธ์ด๊ณ , ๊ทธ๊ฑธ ์ด์šฉํ•˜๋ฉด "return address"์˜ ์˜์—ญ๊นŒ์ง€ ์กฐ์ž‘ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๊ณต๊ฒฉ์ž๋Š” ์•…์˜์ ์ธ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ๋‹ค์Œ์— ๊ธฐ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ return address์— ๋ฎ์–ด์จ์„œ ์‚ฌ์‹ค์ƒ ์‹คํ–‰๊ถŒํ•œ์„ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์…ˆ์ด๋‹ค.

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



๋ฐฉ์–ด๋ฒ• 1: ์ฝ”๋“œ ์ˆ˜์ค€ ์ฒ˜๋ฆฌ

์ƒ๋‹น์ˆ˜์˜ ๊ฒฝ์šฐ๋Š” ๊ทธ๋ƒฅ ์ฝ”๋“œ ๋‚ด์—์„œ ์ฒดํฌ๋ฅผ ๋นก์„ธ๊ฒŒ ํ•ด์„œ ๊ทธ๋Ÿฐ ์“ฐ๊ธฐ ์ž์ฒด๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์—์„œ๋Š” strcpy๋ผ๋Š” ์œ„ํ—˜ํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๋Œ€์‹  ์•ˆ์ „ํ•œ strncpy ๋“ฑ์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ˆˆ์•ž์˜ ์œ„ํ—˜์€ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.



๋ฐฉ์–ด๋ฒ• 2: stack canary

์Šคํƒ ์นด๋‚˜๋ฆฌ๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ ๊ณต๊ฒฉ์„ ํƒ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.

์›๋ฆฌ๋Š” ์ด๋ ‡๋‹ค. ๋ฆฌํ„ด์–ด๋“œ๋ ˆ์Šค์™€ ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์‚ฌ์ด์— ํ•ญ์ƒ canary word๋ผ๋Š” ํŠน์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์„ธํŒ…ํ•ด๋‘”๋‹ค.

์ด word ๊ฐ’์€ ์ •ํ•ด์ ธ์žˆ์ง€ ์•Š๊ณ  ๊ทธ๋•Œ๊ทธ๋•Œ ๋ฐ”๋€Œ๋Š” ๋‚œ์ˆ˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์ด ์ƒํƒœ์—์„œ word ๊ฐ’์ด ๋ฐ”๋€๋‹ค๋ฉด ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋ผ ๊ฐ„์ฃผํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๊ฒŒ ์•„๋‹ˆ๋ฉด ๋ฐ”๋€” ์ด์œ ๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ...

๋‹จ์ ์€ ์„ฑ๋Šฅ์ด ์•ฝ๊ฐ„์€ ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋„ ์กฐ๊ธˆ ๋” ๋จน์„ ๊ฒƒ์ด๊ณ .

c/c++๋‚˜ ๊ธฐํƒ€ ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์€ ๋ณดํ†ต ์ด์™€ ๊ด€๋ จ๋œ stack protection ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.
๊ธฐ๋ณธ์œผ๋กœ ์ผœ์ ธ์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€๋Š” ๊ตฌํ˜„์ฒด๋‚˜ ํ”Œ๋žซํผ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ , ์˜ต์…˜์„ ํ†ตํ•ด ์‚ฌ์šฉ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.



๋ฐฉ์–ด๋ฒ• 3: ASLR

Address space layout randomization์˜ ์ค€๋ง๋กœ, ๊ทธ๋ƒฅ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ์ž์ฒด๋ฅผ ๋žœ๋คํ™”ํ•ด์„œ ์ฃผ์†Œ๋ฅผ ์ถ”์ธก๋„ ํ•  ์ˆ˜ ์—†๊ฒŒ ํ•˜์ž๋Š” ๊ฒƒ์ด๋‹ค.

https://itpenote.tistory.com/701

์ด๊ฑด ๋Œ€๊ฐœ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ์ˆ˜์ค€์—์„œ๋Š” ์ œ์–ดํ•  ์ˆ˜ ์—†๊ณ , ์šด์˜์ฒด์ œ ์ˆ˜์ค€์—์„œ๋งŒ ๊ตฌํ˜„๋œ๋‹ค.
ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์šฐ๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๊ฑด ๊ฒฐ๊ตญ OS๋‹ˆ๊นŒ...

Linux, macOS, Windows, BSD ๋“ฑ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ OS๊ฐ€ ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
์ตœ์‹  ๋ฒ„์ „์˜ OS๋“ค์€ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ์œผ๋กœ ASLR์ด ํ™œ์„ฑํ™”๋˜์–ด์žˆ๋‹ค.



์ฐธ์กฐ
https://en.m.wikipedia.org/wiki/Stack_buffer_overflow
https://en.m.wikipedia.org/wiki/Buffer_overflow_protection#Canaries