์นด๋๋ฆฌ(Canary)๊ฐ ๋ญ์์? ๐ฅ
๐ฅ ์งน์งน์ด์ ๋น์ทํด๋ณด์ด๋ ์ด ์.. ์นด๋๋ฆฌ์๋ผ๊ณ ๋ถ๋ฆฌ๋ ์์ ๋๋ค. ์์ฒญ ๊ท์ฝ๊ณ ๋ฝ์งํ๊ฒ ์๊ฒผ๋ค์.
์ด๋ ๊ฒ ๊ท์ฌ์ด ์๋ฅผ ์ํ ๊ด์ฐ์ ๋ฐ๋ ค๊ฐ์ ์นด๋๋ฆฌ์๊ฐ ๊ธฐ์ ํ๋ฉด ์ผ๋ฅธ ๊ด์ฐ์์ ๋์ค๋ ์์ผ๋ก ์ ๋ ๊ฐ์ค ๋์ถ์ ์ ๋๋ฅผ ์๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ค๊ณ ํ๋ค์. ์ด์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ๊ธฐ๋ฒ์ธ ์นด๋๋ฆฌ๋ ์ฃฝ๊ธฐ ์ง์ ์ ๊ด์ฐ์์ ๋์ค๊ฒ ํ๋ ๊ฒ ์ฒ๋ผ, ํด์ปค๊ฐ ์ ์์ ์ธ ์ฝ๋ ์คํ์ ํ๊ธฐ ์ง์ ์ ํ๋ก๊ทธ๋จ์ ๊ฐ์ ์ข ๋ฃํฉ๋๋ค.
์นด๋๋ฆฌ๋ ์ด๋ป๊ฒ ๊ณต๊ฒฉ์ ๋ง์ ์ ์๋์? ๐ก๏ธ
Stack Overflow์ Return Address Overwrite ๊ณต๊ฒฉ์ ๊ฐ๋จํ๊ฒ ๋ค์ ์ค๋ช ํ๋ฉด, ํฌ๊ธฐ๊ฐ ์ ํด์ง ๋ฒํผ๋ฅผ ๋ฒ์ด๋ ์ ๋ ฅ์ ๊ณ์ ๋ฐ๊ฒ ๋๋ฉด Return Address(RET)๊น์ง ๋ฎ์ด ํด์ปค๊ฐ ์ํ๋ ์ฝ๋ ์คํ์ ํ ์ ์์ต๋๋ค. ๊ทผ๋ณธ์ ์ธ ์ทจ์ฝ์ ์ ์์ธ์ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ์ ๋ ฅ๋ฐ๋ c์ธ์ด์ gets(), scanf(), strcpy() ๋ฑ ์ ํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๋ฒ์ด๋๊ฒ ์ ๋ ฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ด์์ฃ . ๐ค
์ด์ฒ๋ผ RET๋ฅผ CCCC๋ก ์์ ํ๋ฉด 0x43434343๋ก ์คํํ๋ฆ์ด ๋ณ๊ฒฝ๋์ด Segmentation Fault๊ฐ ๋ฐ์ํ๊ฑฐ๋, ์ํ๋ ํจ์์ ์ฃผ์๋ฅผ ์ ์ผ๋ฉด ์ํ๋ ํจ์๋ฅผ ์คํํ๊ฑฐ๋ ์์ฝ๋๋ ์คํํ๋ ๋ฑ ํด์ปค๊ฐ ์ํ๋ ๋๋ก ์คํ ํ๋ฆ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค! ์ด๋ฅผ ๋ง๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฒซ ๋ฒ์งธ๊ฐ ๋ฐ๋ก ์นด๋๋ฆฌ์ธ ๊ฒ์ด์ฃ .
์นด๋๋ฆฌ๋ ํจ์์ ์์๋จ๊ณ(ํ๋กค๋ก๊ทธ)์์ SFP(Stack Frame Pointer)์ด์ ์ ์ฝ์ ๋๊ณ , ํจ์์ ์ข ๋ฃ๋จ๊ณ(์ํ๋ก๊ทธ)์์ ํด๋น ๊ฐ์ด ๋ณ์กฐ๋๋์ง ๊ฒ์ฌํ์ฌ RET๊ฐ ๋ณ์กฐ๋๋ ๊ฒ์ ๋ง๋ ๋ณดํธ ๊ธฐ๋ฒ์ ๋๋ค.
์นด๋๋ฆฌ์ ์๋ ๊ฐ์ด ABCD์์ ๋, ์นด๋๋ฆฌ๊ฐ ์๋ ์ค ๋ชจ๋ฅด๋ ํด์ปค๊ฐ RET๋ฅผ ๋ณ์กฐํ๊ธฐ ์ํด ๋ฒํผ๋ถํฐ RET๊น์ง ์ญ ๋ฎ์ ๋ ์นด๋๋ฆฌ์ ๊ฐ์ด AAAA๋ก ๋ณ๊ฒฝ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๊ด์ฐ์์์ ์นด๋๋ฆฌ์ ๐ฅ๊ฐ ๊ธฐ์ ํด์ ์ผ๋ฅธ ๊ด์ฐ์์ ๋์์ผ ํ๋ ๊ฒ์ฒ๋ผ, __stack_chk_fail() ํจ์๋ฅผ ํธ์ถํ์ฌ โstack smashing detectedโ ์ค๋ฅ ๋ฉ์์ง ์ถ๋ ฅ ํ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ข ๋ฃ๋ฉ๋๋ค.
์นด๋๋ฆฌ๊ฐ ์ ์ฉ๋์ด ์๋์ง ์ด๋ป๊ฒ ์ ์ ์๋์? โ๏ธ
๊ฐ๋จํ ํจ์ ์ํ๋ก๊ทธ ๋ถ๋ถ์ __stack_chk_fail() ํจ์๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ด ์๋ ๊ฒ์ผ๋ก ์นด๋๋ฆฌ๊ฐ ์ ์ฉ๋์ด ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ด ๋ถ๋ถ์ด ๋ฐ๋ก ์ ์ฅ๋์ด ์๋ ์นด๋๋ฆฌ ๊ฐ๊ณผ ํ์ฌ ์นด๋๋ฆฌ๋ฅผ ๋น๊ตํด์ ๊ฐ์ง ์์ ๋ ์คํ๋์ด __stack_chk_fail() ํจ์๊ฐ ํธ์ถ๋๊ณ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ ๋ถ๋ถ์ด์์.
checksec์ ์ฌ์ฉํด ํ์ธํ ์๋ ์์ต๋๋ค!
๊ทธ๋ผ ์นด๋๋ฆฌ๊ฐ ์์ผ๋ฉด ์์ ๊ณต๊ฒฉ์ ํ ์ ์๋์? ๐ฅบ
์นด๋๋ฆฌ๋ ๋ฌผ๋ก ๊ผญ ํ์ํ ๋ฐฉ์ด ๋ฐฉ๋ฒ์ด์ง๋ง, ์๋ฒฝํ ๋ฐฉ๋ฒ์ ์๋์์. ์๋ฅผ ๋ค์๋ฉด ๊ด์ฐ์์ ์นด๋๋ฆฌ์ ๐ฅ๋ ๊ทธ๋๋ก ์ด์์๋๋ฐ ์ฌ๋์ด ๊ฐ์๊ธฐ ๊ธฐ์ ํ๊ฒ ๋๋๊ฑฐ์ฃ . ๐
์ฌ์ค ์นด๋๋ฆฌ๊ฐ์ด ๋ฎํ์ฐ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์๋๋ผ, ์ฒ์์ ์นด๋๋ฆฌ๊ฐ๊ณผ ๋ง์ง๋ง์ ์นด๋๋ฆฌ๊ฐ์ ๋น๊ตํด ๋๊ฐ์์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ ์ ์์๊น์? ์ฒ์์ ์นด๋๋ฆฌ๊ฐ์ ์์๋ด์ด ๊ทธ ๊ฐ์ ์นด๋๋ฆฌ์ ๊ทธ๋๋ก ๋ฎ์ด์ฐ๋ฉด ์์ ํ๋ค๊ณ ์๊ฐํ์ฌ ์ข ๋ฃ์ํค์ง ์๊ณ ํด์ปค์ ์๋๋๋ก ํ๋ก๊ทธ๋จ ํ๋ฆ์ ๋ณ๊ฒฝํ ์ ์์ด์.
์ค๋์ ๊ฐ๋จํ๊ฒ ์นด๋๋ฆฌ๊ฐ ๋ฌด์์ธ์ง ์์๋ดค์ต๋๋ค! ์นด๋๋ฆฌ๋ฅผ ์ ์ธํ๊ณ ๋ค๋ฅธ ๋ฐฉ์ด๊ธฐ๋ฒ์ ๋ํด์๋ ์ฐจ๊ทผ์ฐจ๊ทผ ์๋ ค๋๋ฆฌ๋๋ก ํ ๊ฒ์. ๊ทธ๋ผ ๊ธ์์ผ ํด์ปค์ TMI๋ ๊ธฐ๋ํด์ฃผ์ธ์! ๐ฅ