ํด์ปค๋ค์ด ์ฌ๋ํ๋ ํดํน ํ
ํฌ๋ Stack Buffer Overflow์ ๋ํด ์๊ฐํฉ๋๋ค๐ ํดํน ์๋ ค์ค๊ฒ 2ํ: Out-of-Bounds ๋ง์ด ๊ด์ฌ์ ๊ฐ์ ธ์ฃผ์
์ ๋ฌด์ฌํ ๋ ๋ฒ์งธ๋ก ๋์์จ ํดํน ๊ฐ๋ฅด์ณ์ค๊ฒ์
๋๋ค! ๐ ์ด๋ฒ ์ฃผ๋ Out-of-Bounds ์ทจ์ฝ์ ์ ๋ํด ์๊ธฐ๋ฅผ ํด๋ณด๋ ค๊ณ ํด์. ์ค์ฌ์ OOB๋ผ๊ณ ๋ ๋ถ๋ฅด๋๋ฐ ํน์ ๋ค์ด๋ณธ ์ ์์ผ์ ๊ฐ์? ๐ค Out-of-Bounds read, Out-of-Bounds write, Out-of-Bounds access๊น์ง, ๋ชจ๋ ์ด ์ทจ์ฝ์ ์ผ๋ก ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ผ ์ธ ๋ง๋ฆฌ ํ ๋ผ ๐ฐ๐ฐ๐ฐ ํ ๋ฒ์ ์ก์ผ๋ฌ ์ผ๋จ ๋ฐ๋ผ์ค์ธ์! Out-of-Bounds๊ฐ ๋ญ์์? ๊ตฌ๊ธ๋๊ป์๋ ์ถ์
๊ธ์ง ๊ตฌ์ญ์ ๋ผ๊ณ ์๋ ค์ฃผ์๋ค์. ๐ Out-of-Bounds ์ทจ์ฝ์ ์ ๋ฐฐ์ด ๋ฑ ์ง์ ํด๋์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ธ๋ฑ์ค์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค. ์ถ์
๊ธ์ง ๊ตฌ์ญ์ด๋ผ๋ ๋ง๋ ์์ฃผ ํ๋ฆฐ ๊ฑด ์๋ ๊ฒ ๊ฐ๋ค์! Buffer Overflow๋ Out-of-Bounds๋ ํท๊ฐ๋ ค์ '์ง์ ํด๋์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ ์ ๊ทผํ ์ ์๋ค๊ณ ์! ๊ทธ๋ผ ์ง๋์ฃผ์ ๊ณต๋ถํ Buffer Overflow(๋ณต์ตํ๋ฌ ๋ฐ๋ก ๊ฐ๊ธฐ!)๋ ์ฐจ์ด์ ์ด ๋ญ์ฃ ? ๐ฑ' ๋ผ๊ณ ํท๊ฐ๋ฆด ์ ์์ ๊ฒ ๊ฐ์์. ํ์ง๋ง ์ด๋ค์ ์ทจ์ฝ์ ์ ๋ฐ์ ์์ธ๊ณผ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๊ฐ ๋ชจ๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์งง๊ฒ ๋ณต์ตํ๊ณ ๋์ด๊ฐ์๋ค! Buffer Overflow๋ ๋ฒํผ์ ๊ธธ์ด์ ๋ํ ๊ฒ์ฆ์ ์ํํ์ง ์์ C์ธ์ด์
gets() , scanf() ๋ฑ์ ํจ์๋ก ์ํ๋ ๊ฐ์ return address๊น์ง ๋ฎ์ ์ ์์์ด์. ๋ฐ๋ผ์ Buffer Overflow์ ๋ชฉ์ ์ ํ๋ก๊ทธ๋จ์ ์คํ ํ๋ฆ์ ๋ง์๋๋ก ์ ํ๋ ๊ฑฐ์์ฃ .Out-of-Bounds๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ๋ ์ธ๋ฑ์ค์ ๋ฒ์์ ๋ํ ๊ฒ์ฌ๋ฅผ ์ํํ์ง ์์ ์ง์ ํด๋์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ ์์ญ ๋ฐ์ ์๋ ๊ฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๊ทธ ์์ญ์ ๊ฐ์ ์ฝ์ ์๋ ์๊ณ (Outs-of-Bounds read), ์ํ๋ ๊ฐ์ ์ธ ์๋ ์์ด์(Out-of-Bounds write)! ๊ทธ๋ผ ๋๋์ฒด ์ธ๋ฑ์ค ๋ฒ์์ ๋ํ ๊ฒ์ฌ๋ฅผ ์ํํ์ง ์์๋ค๋ ๊ฒ ๋ญ์์? ๐ ํด๋น ์ฝ๋๋ ์ธ๋ฑ์ค ๋ฒ์์ ๋ํ ๊ฒ์ฌ๋ฅผ ์ํํ์ง ์์ ์ฝ๋์์. ๋ฌด์จ ๋ฌธ์ ๊ฐ ์์๊น์? ๐ค ์ง์ ํด๋์ ๋ฐฐ์ด์ 10๊ฐ์ธ๋ฐ ํ์ธํ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ๋ ๊ณผ์ ์์ "0~9 ์ค ํ์ธํ index ๋ฒํธ๋ฅผ ์ ํํด ์ฃผ์ธ์."๋ผ๊ณ ๋งํ๋ฉฐ ์ ๋ง๋ก 0~9 ์ค์ ์
๋ ฅํ๋์ง ๊ฒ์ฌ๋ฅผ ํ์ง ์๋ค์.
-100 ๋๋ 100์ ์
๋ ฅํ๊ฑฐ๋ ํน์.. ๋น๋ฐ ์ ๋ณด๊ฐ ์๋ ๊ณณ์ ์ธ๋ฑ์ค๋ฅผ ์
๋ ฅํ๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ฒ ๋ ๊น์?array[10]์ผ๋ก ์ ํด๋จ๋๋ฐ ์ด๋ป๊ฒ? ์? array[10]์ ๋ณธ๋ค๋ ๊ฑฐ์์? ์ฐ์ ๋ฐฐ์ด์ ํน์ง ์ค ํ๋๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ์๋ ์ฌ๋ฌ ๋ณ์๊ฐ ๋ชจ์ฌ์ ํ๋์ ๋ฐฐ์ด์ ์ด๋ฃฌ๋ค๋ ๊ฑฐ์์. ์์ ์ฝ๋๋ ์ด๊ฒ์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋ ค๋ณผ ์ ์๊ฒ ๋ค์. ๋ฐฐ์ด์ ์ฐ์์ฑ ๋๋ถ์ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ํตํด ๊ฐ ์์๋ฅผ ์ฝ๊ฒ ๊ตฌ๋ถํ๊ณ ๋ฐฐ์ด ์์ ์ฃผ์ + ์๋ฃํ ํฌ๊ธฐ * ์ธ๋ฑ์ค๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค๋ฉด array[9]๋ array[0]์ ์์ ์ฃผ์ + 4 * 9๋ก ์ ๊ทผํ ์ ์์ด์.
๊ทธ๋ผ ์ธ๋ฑ์ค๋ก 10์ ์ฃผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
array[0]์ ์์ ์ฃผ์ + 4 * 10์ ์ฐพ์๊ฐ๊ธฐ ๋๋ฌธ์ printf("array[%d]: %d", index, array[index]); ์์ password ๊ฐ์ ์ถ๋ ฅํ๋ฏ๋ก ํ๋ก๊ทธ๋จ์ด ์ ํ ์๋ํ์ง ๋ชปํ ๊ฐ์ ์ ๊ทผํด ์ถ๋ ฅ๋๋ ๊ฑฐ์ฃ .๋ง์ฝ ์ธ๋ฑ์ค๋ฅผ ์ ๋ ฅ๋ฐ์์ ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ์ ๋ ฅ๋ฐ๋๋ค๋ฉด, ์๋ํ์ง ๋ชปํ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ์ ๋ ฅํ ์๋ ์๊ณ ์! ๋ฌผ๋ก ๊ทธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ค์์ ์คํํ ์ฃผ์๋ผ๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก ์ํ๋ ์ฝ๋๊น์ง ์คํํ ์ ์๊ฒ ๋ค์. ๐ Out-of-Bounds๋ฅผ ์ด๋ป๊ฒ ๋ง์ ์ ์์๊น์? ์ง์ ํด๋์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ ๋ฐ์ โ๏ธ์ถ์
๊ธ์ง ๊ตฌ์ญโผ๏ธโ๏ธ์ด๋ผ๋ ํ์ํ์ ๋ฑ ์ค์นํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ธ๋ฑ์ค ๋ฒ์๋ฅผ ์ ํํด์ฃผ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ ๊ฒ์ฒ๋ผ ๋ฒ์๋ฅผ ์ ํํด์ฃผ๋ฉด Out-of-Bounds๋ฅผ ์ฝ๊ฒ ๋ฐฉ์งํ ์ ์๋ต๋๋ค. ํดํน ๊ฐ๋ฅด์ณ์ค๊ฒ๋ ๋ค์ ์ฃผ์ ์๋ก์ด ์ทจ์ฝ์ ์ผ๋ก ๋์์ฌ๊ฒ์! ๐ ์ค๋ ์ ํด๋๋ฆฐ ๋ด์ฉ์ด ๋ง์์ ๋์
จ๋์? ์ฃผ์ ์น๊ตฌ๋ค์๊ฒ ๋ด์ค๋ ํฐ๋ฅผ ์ถ์ฒํด์ฃผ์ธ์! ๋ค์์ฃผ์๋ ์์ฐฌ ๋ด์ฉ์ผ๋ก ๋์์ค๊ฒ ์ต๋๋ค. ๐ ํน์ ๋ง์์ ์๋๋ ๋ถ๋ถ์ด ์์๋์? ์ฌ๊ธฐ์์ ํผ๋๋ฐฑ์ ์ ๋ฌํด์ฃผ์ธ์! ์ฌ๋ฌ๋ถ์ ์๊ฒฌ๋ค์ ์ ๊ทน ๋ฐ์ํด์ ๋์ฑ ์ ์ตํ ๋ด์ค๋ ํฐ๋ฅผ ๋ง๋ค์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค. ๐ ๊ตฐ์๋ ํดํน์ฐ๊ตฌ์ |