ํด์ปค๋ค์ด ์ฌ๋ํ๋ ํดํน ํ
ํฌ๋ Stack Buffer Overflow์ ๋ํด ์๊ฐํฉ๋๋ค๐ ํดํน ์๋ ค์ค๊ฒ 1ํ: Stack Buffer Overflow ๋ฐ๊ฐ์์. ์ฒ์ ๋ง๋๊ฒ ๋์๋ค์! ๐
ํด์ปค๋ค์ด ์ฌ๋ํ๋ ํดํน ํ
ํฌ๋ Stack Buffer Overflow์ ๋ํด ์๊ฐํฉ๋๋ค. Buffer Overflow๋ 2019๋
MITRE Corporation์ด ๋ฐํํ '๊ฐ์ฅ ์ํํ ์ํํธ์จ์ด ์ค๋ฅ 25๊ฐ' ์ค์ 1์๐ฅ์ ์ค๋ฅผ ๋งํผ ์ ๋ช
ํ ํดํน ๊ธฐ๋ฒ์
๋๋ค. Buffer Overflow๊ฐ ๋ญ์์? Buffer Overflow๋ ํดํน ์ ํ๋ ์ ์ปด๋์ด ์น๊ตฌ๋ ์ ๋งํผ ๋๋ฆฌ ์๋ ค์ ธ ์์ต๋๋ค. ๋ง์์, ๋ง ๊ทธ๋๋ก์ ์๋ฏธ์
๋๋ค! ๐
์ง์ ๋ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ปํ๋ Buffer ์ ๋์ณํ๋ฅธ๋ค๋ Overflow ์ ํฉ์ฑ์ด๋ก ์ฐ๋ฆฌ์ ์ ์ฅ ๊ณต๊ฐ์ด ๋์ณ์ ํ๋ฅด๊ณ ์์ ๋ ๊ณผ์ฐ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์์๋ณผ๊น์?Stack? Heap? ์ด๊ฑด ๋ ๋ญ์์?
๋จผ์ Buffer Overflow๋ ๋ฐ์ํ๋ ์์น์ ๋ฐ๋ผ์ Stack Buffer Overflow, Heap Buffer Overflow๋ก ๋๋๊ฒ ๋ฉ๋๋ค. Stack์ ํจ์ ๋งค๊ฐ ๋ณ์, ์ง์ญ ๋ณ์ ๋ฐ ๊ธฐํ ํจ์ ๊ด๋ จ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์์ญ์ด๊ณ , Heap์ ์ฌ์ฉ์๊ฐ ์ง์ malloc ๋ฑ ๋์ ์ผ๋ก ํ ๋นํ ๋ณ์๊ฐ ์ ์ฅ๋๋ ์์ญ์ด์ฃ .์ค๋์ ๊ทธ์ค์์๋ Stack Buffer Overflow์ ์ด์ ์ ๋ง์ถฐ์ ๊ฐ์ด ํ๋์ฉ ์์๋ด์!
๋๋์ฒด ์ ์ฅ ๊ณต๊ฐ์ด ๋์ณ์ ํ๋ฅธ๋ค๋ ๊ฑด ๋ญ๊ณ ์ ์ผ์ด๋๋ ๊ฑธ๊น์? ๐ค c์ธ์ด์ gets() , scanf() , strcpy() ๋ฑ์ ํจ์๋ ๋ชจ๋ ์
๋ ฅ๋ฐ๊ฑฐ๋ ์ ์ฅํ๋ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ์ง ์์์.
Enter๋ฅผ ์
๋ ฅํ๊ธฐ ์ ๊น์ง ๋ชจ๋ ์
๋ ฅ๋ฐ๋ gets() ํจ์๋ฅผ ์์๋ก ์์ธํ ์ดํด๋ณผ๊ฒ์.ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด ์ฝ๋๋ฅผ ์์ฑํ ๋๋ '์ฌ๋๋ค์ด ๋น์ฐํ 10๊ธ์๋ง ์
๋ ฅ์ ํ๊ฒ ์ง?'๋ผ๋ ๊ฐํ ๋ฏฟ์์ ๊ฐ์ง๊ณ ์ง ๊ฒ ๊ฐ๋ค์. ์ฌ๊ธฐ์ ์๊ธฐ๋ ๋ฌธ์ ์ ์ '์ฌ๋๋ค์ด 11๋ฒ์งธ, 12๋ฒ์งธ ๊ธ์๋ฅผ ์
๋ ฅํ๋ฉด ์ด๋กํ์ง?'๋ผ๋ ์๊ฐ์ ํ์ง ์๊ณ ์
๋ ฅ๋ฐ์ ๋ฒํผ์ ๊ธธ์ด์ ๋ํ ๊ฒ์ฆ์ ์ ํํ ์ํํ์ง ์์ ๊ฒ์ด์ฃ ! ๐ 11๋ฒ์งธ, 12๋ฒ์งธ ๊ธ์๋ฅผ ์
๋ ฅํ๋๊ฒ ๋ฌด์จ ๋ฌธ์ ๊ฐ ๋๋์? ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๋ ๊ฑด ๋ญ๋ ๋ญ๋ ํด๋ ๋ฐ๋ก return address ๊น์ง ๊ฐ์ด ๋ฎ์ฌ ์ฐ์ด๋ ๊ฒ์
๋๋ค. ๐ฑ๋ฆฌํด ์ด๋๋ ์ค์๋ ํจ์๋ฅผ ํธ์ถํ๊ณ ๋ณต๊ทํ ๋ ์ฐธ์กฐํ ์ฃผ์๊ฐ ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ํ๋ ๊ณณ์ ์ฃผ์๋ฅผ ์ ์ผ๋ฉด ํ๋ก๊ทธ๋จ์ ์คํ ํ๋ฆ์ ๋ง์๋๋ก ์ ํ ์ ์์ด์. ๊ทธ๋ผ ์ํ๋ ํจ์๋ฅผ ํธ์ถํ ์๋, ์์ฝ๋๊ฐ ์์นํ๋ ์ฃผ์๋ฅผ ์๋ฉด ์์ฝ๋๋ฅผ ์คํํ ์๋, ๋ ๋์๊ฐ buf์ ์ํ๋ ์ฝ๋๋ฅผ ์ ๊ณ buf์ ์์น๋ก ๋ฎ์ผ๋ฉด ๊ทธ buf์ ์ ํ ์ฝ๋๋ฅผ ์คํํ ์๋ ์๊ฒ ๋์ฃ . ์ฐธ๊ณ ๋ก ์์์ ์๋ Segmentation Fault๋ ํ๋ก๊ทธ๋จ์ด ํ์ฉ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ ์์ ๋ฐ์ํ๋ ์ค๋ฅ์
๋๋ค. ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํ๋ก๊ทธ๋จ์ ๊ณ์ํด์ ์คํํ ์ ์๋ค๊ณ ํ๋จํ๊ณ ํ๋ก๊ทธ๋จ์ ๊ฐ์ ๋ก ์ข
๋ฃํด์. Stack Buffer Overflow๋ฅผ ๋ง์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น์?
๋ฌผ๋ก ์์ฃ ! ๐
์ฐ์ ๊ฐ๋ฐ์์ ๊ด์ ์์ ์ด๋ฐ ์ทจ์ฝ์ ์ ๋ง๊ธฐ ์ํด์๋ ๊ธธ์ด ์ ํ ์๋ ํจ์์ ์ฌ์ฉ์ ํ์ง ๋ง์์ผ ํฉ๋๋ค.
๊ธธ์ด ์ ํ ์๋ gets(char *s) ๋์ fgets(char *s, int n, FILE *stream) ๊ฐ์ด ๊ธธ์ด ์ ํ ์๋ ํจ์๋ฅผ ์ฌ์ฉํด 'n๋งํผ๋ง ์
๋ ฅ์ ๋ฐ๊ฒ ๋ค!'๊ณ ์๋ ค์ค์ผ ํด์.Stack Canary ๋ ๋ฆฌํด ์ด๋๋ ์ค ์ ์ ์ฝ์
๋์ด Buffer Overflow๊ฐ ๋ฐ์ํด ๊ฐ์ด ๋ณ์กฐ๋์๋์ง ๊ฒ์ฌํด Buffer Overflow๊ฐ ๋ฐ์ํ๋ค๊ณ ์๊ฐ๋๋ฉด ๊ทธ๋๋ก ํ๋ก๊ทธ๋จ์ ์ข
๋ฃ์ํค๊ณ , ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์๋ฅผ ์คํํ ๋๋ง๋ค ๋๋คํํ๋ ASLR , ๋ฉ๋ชจ๋ฆฌ์ ์ฝ๋๋ฅผ ์คํํ์ง ๋ชปํ๊ฒ ํ๋ NX ๊ฐ์ ๋ณดํธ ๊ธฐ๋ฒ์ด ์กด์ฌํด์.ํ์ง๋ง ์ด๊ฑธ๋ก ๋ค ๋ณดํธ๋๋ฉด ๊ดํ '๊ฐ์ฅ ์ํํ ์ํํธ์จ์ด ์ค๋ฅ 25๊ฐ' ์ค์ 1์๊ฐ ์๋๊ฒ ์ฃ ?
๋ณดํธ ๊ธฐ๋ฒ๋ค ๋ชจ๋ ์ฐํ๊ฐ ๊ฐ๋ฅํ๋ต๋๋ค. ๐ฑ
์ธ์ ๊ฐ ์์ธํ ์ค๋ช
ํด๋๋ฆด ์ทจ์ฝ์ ์ผ๋ก ์ฐพ์์ฌ ์ ์์ ๊ฒ ๊ฐ๋ค์. ๐ ํดํน ๊ฐ๋ฅด์ณ์ค๊ฒ๋ ๋ค์ ์ฃผ์ ์๋ก์ด ์ทจ์ฝ์ ์ผ๋ก ๋์์ฌ๊ฒ์! ์ค๋ ์ ํด๋๋ฆฐ ๋ด์ฉ์ด ๋ง์์ ๋์
จ๋์? ์ฃผ์ ์น๊ตฌ๋ค์๊ฒ ๋ด์ค๋ ํฐ๋ฅผ ์ถ์ฒํด์ฃผ์ธ์! ๋ค์์ฃผ์๋ ์์ฐฌ ๋ด์ฉ์ผ๋ก ๋์์ค๊ฒ ์ต๋๋ค. ๐ ํน์ ๋ง์์ ์๋๋ ๋ถ๋ถ์ด ์์๋์? ์ฌ๊ธฐ์์ ํผ๋๋ฐฑ์ ์ ๋ฌํด์ฃผ์ธ์! ์ฌ๋ฌ๋ถ์ ์๊ฒฌ๋ค์ ์ ๊ทน ๋ฐ์ํด์ ๋์ฑ ์ ์ตํ ๋ด์ค๋ ํฐ๋ฅผ ๋ง๋ค์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค. ๐ ๊ตฐ์๋ ํดํน์ฐ๊ตฌ์ |