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