๋ถ์คํธ์ฝ์ค CS50 ์ฝ์นญ์คํฐ๋ 5์ฃผ์ฐจ ์ฃผ์ ๋ '๋ฉ๋ชจ๋ฆฌ' !
์ ์ค์ํ ์ฃผ์ ๊ฐ ์๋ค ์ ๋ง,,,,
ํจ์จ์ ์ํด์๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฐ์ง ์๊ฐ ์๋ค
5์ฃผ์ฐจ์์๋ ํฌ์ธํฐ์ malloc()
, free()
๋ฑ
๋ฉ๋ชจ๋ฆฌ์ ๊ด๋ จ๋ ๋ด์ฉ์ ๋ํด ์ง์ค์ ์ผ๋ก ๋ฐฐ์ฐ๋ ์๊ฐ์ ๊ฐ์ก๋ค
ํฌ์ธํฐ(pointer) : ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์
์ด๋ค ๋ณ์์ ์ฃผ์๋ฅผ ์ ์ฅํ ๋๋ * ์ฐ์ฐ์ ์ฌ์ฉ์์)
int *p = &n;
p๋ int๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ด๋ฉฐ, n์ ์ฃผ์๋ฅผ p์ ์ ์ฅ
*p
๋ p์ ์ฃผ์๋ก ๊ฐ์ค,&n
์ n์ ์ฃผ์ ๋ก ์ง์
์ฃผ์๋ ๋ฐ๋์ ํฌ์ธํฐ์ ์ ์ฅํด์ผ ํจ
๋จ์ํ p๊ฐ n์ ๊ฐ๋ฆฌํค๊ณ ์๋ค๊ณ ์๊ฐํด๋ ๋ฌด๋ฐฉ
๋ฉ๋ชจ๋ฆฌ ํ ๋น : ๋ฉ๋ชจ๋ฆฌ ์ผ๋ถ๋ถ์ ๊ฐ์ ธ์์ ๊ทธ๊ณณ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์ฃผ๋ ๊ฒ
malloc() : ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์, ๊ดํธ ์์๋ ํ ๋น ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ ๋ ฅ
free() : ํ ๋น๋์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํ
heap overflow :
malloc()
์ ๊ณ์ ํธ์ถํด์ ๋๋ฌด ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด ๋ฉ๋ชจ๋ฆฌ ์ ๋ค๋ฅธ ๋ด์ฉ์ ๋ฎ์ด์
stack overflow : ์๊ธฐ ์์ ์ ๊ณ์ ํธ์ถํ๋ ๋ฒ๊ทธ๊ฐ ์๋ ํ๋ก๊ทธ๋จ์ ์คํํ ๋ ๋ฐ์
buffer overflow : ์ฌ์ง, ํ์ผ์ด ์ ์ด๋ฆฌ์ง ์๊ณ ํ๋ฉด์ด ์ ์งํ๊ฑฐ๋ ์์ ๋์ํ์ง ์๋ ์ํฉ์ด ์๊ธฐ๋ ๊ฒ
์ด์ ์ ํ๋ฏธ์
ํ๋ค๊ฐ ํฌ์ธํฐ๋ฅผ ์ฒ์ ๋ณด๊ณ ๊ตฌ๊ธ๋ง์ ํด๋ดค๋๋ฐ
์ ํ.. ์ ๋ง ์ ํ.. ๊ฐ์ด ์กํ์ง๊ฐ ์์์ ๋ง๋งํ์๋ค
์ด๋ฒ์ ๊ฐ์ ๋ค์ผ๋ฉด์ ํฌ์ธํฐ๊ฐ ์กฐ๊ธ ์ต์ํด์ง๊ธฐ ์์ํ๊ณ
์ด์ง์ ๊ฐ์ด ์กํ ๊ฒ ๊ฐ์๋ค โจ
์ ๋ฒ์ฃผ ์๊ณ ๋ฆฌ์ฆ ํ๊ธฐ๋ฒ๋ณด๋ค๋ ์ดํด๊ฐ ์๋๋ค..ใ ใ
์์ง ํ๊ธฐ๋ฒ์ด ํท๊ฐ๋ฆฌ๊ธด ํ์ง๋ง ํด์ฆ๋ ๋ฌด๋ํ๊ฒ ํต๊ณผ!
์๋ ๋ด์ฉ์ ์ด๋ฒ ํ๋ฏธ์ ์ ํตํด '๋ฉ๋ชจ๋ฆฌ์ Overflow ๊ฐ๋ '์ ๋ํด ์ฐพ์๋ณด๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค
1) ์์ ์์ ์ธ๊ธ๋์๋ Heap overflow์ stack overflow์ ๋ํด์ ์ด๋ค ๊ฒฝ์ฐ์ ๋ฐ์์ด ๋๋์ง ์์ ํด์ฃผ์ธ์.
ํ(Heap) ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ์ ์๋ ์ปค๋ค๋ ์์ญ์ผ๋ก, ์ฌ์ฉ์์ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋์ ์ผ๋ก ํ ๋น๋๊ณ ํด์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ๋ฎ์ ์ฃผ์์์ ๋์ ์ฃผ์์ ๋ฐฉํฅ์ผ๋ก ํ ๋นํ๋ฉฐ, malloc() ๋๋ new ์ฐ์ฐ์๋ฅผ ํตํด ํ ๋นํ๊ณ free() ๋๋ delete ์ฐ์ฐ์๋ฅผ ํตํด ํด์ ๋๋ค.
์คํ(Stack) ์์ญ์ ํจ์์ ํธ์ถ๊ณผ ๊ด๊ณ๋๋ ์ง์ญ๋ณ์์ ๋งค๊ฐ๋ณ์๊ฐ ์ ์ฅ๋๋ ์์ญ์ด๋ค. ํจ์์ ํธ์ถ๊ณผ ํจ๊ป ํ ๋น๋๋ฉฐ ํจ์์ ํธ์ถ์ด ์๋ฃ๋๋ฉด ์๋ฉธํ๋ค. ์ด๋ ๊ฒ ์คํ ์์ญ์ ์ ์ฅ๋๋ ํจ์์ ํธ์ถ ์ ๋ณด๋ฅผ ์คํ ํ๋ ์(Stack Frame)์ด๋ผ๊ณ ํ๋ค. ํ๋ก๊ทธ๋จ์ด ์๋์ผ๋ก ์ฌ์ฉํ๋ ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก, ๋ฉ๋ชจ๋ฆฌ์ ๋์ ์ฃผ์์์ ๋ฎ์ ์ฃผ์์ ๋ฐฉํฅ์ผ๋ก ํ ๋น๋๋ค.
ํ ์์ญ์ด ํด์๋ก ์คํ ์์ญ์ด ์์์ง๊ณ ์คํ ์์ญ์ด ํด์๋ก ํ ์์ญ์ด ์ปค์ง๋ค. ์คํ์ ์ง์ญ๋ณ์๋ ์ฌ์ฉ๋๊ณ ์๋ฉธํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ฉ๋์ด ๋ถํ์คํ๋ค. ๋ฐ๋ผ์ ์คํ ์์ญ์์์ ์ฃผ์๊ฐ์ ๋ฐ์์๋ถํฐ ์ฑ์์ง๋ฉฐ ๊ทธ ๋ค์ ์ฃผ์๋ ์ ์ธ๋ ์์๋๋ก ์ ํด์ง๋ค. ๋ฐ๋ฉด ํ ์์ญ์์์ ์ฃผ์๊ฐ์ ์์์๋ถํฐ ์ฑ์ ๋ด๋ ค์ง๊ธฐ ๋๋ฌธ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฃผ์๊ฐ ๊ฒน์น๊ฒ ๋๋ ์ค๋ฒํ๋ก์ฐ(Overflow)๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ฆ, ํ์ด ์์์๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ๋ด๋ ค์ค๋ค๊ฐ ์คํ์์ญ์ ์นจ๋ฒํ๋ ๊ฒฝ์ฐ ๋๋ ์คํ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ์ฌ๋ผ๊ฐ๋ค๊ฐ ํ ์์ญ์ ์นจ๋ฒํ๋ ๊ฒฝ์ฐ์ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ค.
[์ฐธ๊ณ ์๋ฃ ์ถ์ฒ]
https://hwan-shell.tistory.com/13
https://velog.io/@hidaehyunlee/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
2) Strcpy์ strncpy์ ์ฐจ์ด์ ์ ์์ ํด๋ณด์ธ์. (์ด๋ค ๊ฒ์ ์ถ์ฒํ๋์ง์ ๊ทธ ์ด์ ์ ๋ํด์ ์์ ํด์ฃผ์ธ์.)
Strcpy()๋ string copy์ ์ฝ์๋ก์ strcpy(char dst, const char src)์ ๊ฐ์ด ์ฌ์ฉํ๋ค. Dst๋ destination, src๋ source์ ์ค์๋ง๋ก, src ๋ฌธ์์ด์ dst ๋ฒํผ์ ๋ณต์ฌ, ์ ์ฅํ๋ค๋ ์๋ฏธ์ด๋ค. ํ์ง๋ง src ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ํ์ธํ์ง ์์ผ๋ฏ๋ก dst ๋ฒํผ๋ฅผ ์ด๊ณผํ๋ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฐ ์ทจ์ฝ์ ์ ์ด์ฉํ์ฌ root ๊ถํ์ ์์ ํ๋ํ ์ ์์ผ๋ฉฐ ์ ์์ ์ธ ์ฝ๋๋ฅผ ์ฌ์ด๋ฒ๋ฆด ์๋ ์๋ค. ์ด๋ฅผ ๋์ํ๊ธฐ ์ํด strncpy()๊ฐ ๋ฑ์ฅํ๋ค.
Strncpy()๋ string new copy์ ์ฝ์๋ก strncpy(char dst, const char src, size_t len)์ ๊ฐ์ด ์ฌ์ฉํ๋ค. Src ๋ฌธ์์ด์ length ๋งํผ dst ๋ฒํผ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ src ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ์ ํ๋์ด ์์ด ๋ฒํผ ์ค๋ฒํ๋ก์ฐ์ ์์ด ์์ ํ๋ค. ํ์ง๋ง strncpy์ ๊ฒฝ์ฐ์๋ ๋ฒํผ์ ํฌ๊ธฐ์ ๋์ผํ ์ ๋ ฅ ๋ฌธ์์ด์ ๊ฒฝ์ฐ ์ข ๋จ ๋ฌธ์ null์ด ํฌํจ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฒํผ์ ํฌ๊ธฐ์ ๊ฐ์ ๋ฌธ์์ด๋ ํ์ธํด์ผ ํ๋ค.
[์ฐธ๊ณ ์๋ฃ ์ถ์ฒ]
https://m.blog.naver.com/PostView.nhn?blogId=on21life&logNo=221479472885&proxyReferer=https:%2F%2Fwww.google.com%2F
3) ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ, ๋ณต์ฌ, ์ด๋, ๋น๊ต์ ๊ฐ์ ํจ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ต๋๋ค. ์ฌ์ฉ๋ฐฉ๋ฒ์ ์์งํ๊ณ , ๊ฐ๋จํ๊ฒ ์ฝ๋๋ก ๊ตฌํ ํ ์ ์์ ์ผ๋ก ๋์์ด ๋๋์ง ํ์ธํด๋ณด์ธ์.
๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ธฐํํ ๋์๋ memset()์ ์ฌ์ฉํ ์ ์๋ค. Memset()์ ์ฌ์ฉํ ๋์๋ ์ด๊ธฐํํ ๋ณ์(ํฌ์ธํฐ ๋ณ์), ์ด๊ธฐํ ํด์ค ๊ฐ, ์ด๊ธฐํ ํด์ค ์์ญ์ ํฌ๊ธฐ ์์ผ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ ฅํด์ค๋ค. Memset()์ ์ด์ฉํ๊ธฐ ์ํด์๋ memset()์ด ์ ์๋์ด ์๋ string.h ํ์ผ์ ํฌํจํด์ผ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
Memcpy()๋ string.h ํ์ผ์ ์ ์๋์ด ์์ผ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณต์ฌํ ๋ ์ฌ์ฉํ๋ค. Memcpy(๋ณต์ฌํ ์ฃผ์, ๋ณต์ฌํ ๊ฐ, ๋ณต์ฌํ ๊ธธ์ด)๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
Memmove() ๋ํ string.h ํ์ผ์ ์ ์๋์ด ์์ผ๋ฉฐ, ์ฌ์ฉ๋ฒ์ memmove(์ฎ๊ธธ ์์น, ๋ณต์ฌ ์์ ์์น, ๋ณต์ฌํ ๊ธธ์ด) ์ด๋ค. Memmove()๋ memcpy()์ ๋ฌ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๊ฒน์ณ๋ ๋๋ค๋ ์ฅ์ ์ด ์์ด memcpy()๋ณด๋ค ์์ฃผ ์ฌ์ฉ๋๊ณค ํ๋ค.
Memcmp()๋ string.h ํ์ผ์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ฌ์ฉ๋ฒ์ memcmp(๋น๊ตํ ๊ฐ1, ๋น๊ตํ ๊ฐ2, ๋ฐ์ดํฐ ๊ฐ์)์ด๋ค. ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฐ๋ค๋ฉด 0, ๋น๊ตํ ๊ฐ1์ด ํฌ๋ฉด 1, ๋น๊ตํ ๊ฐ1์ด ์์ผ๋ฉด -1์ ๋ฐํํ๋ค.
[์ฐธ๊ณ ์๋ฃ ์ถ์ฒ]
https://m.blog.naver.com/errorsoft666/221875718137
https://m.blog.naver.com/PostView.nhn?blogId=sharonichoya&logNo=220508334439&proxyReferer=https:%2F%2Fwww.google.com%2F
https://aossuper8.tistory.com/22
ํ์ผ ์คํฐ๋๋ฅผ ๊ตฌํ ๋ค ๊ธ์์ผ์ ๋ผ์ด๋ธ๋ก ๊ฐ์๋ฅผ ๋ค์ ์ ์๊ฒ ๋ผ์
ํ ์์ผ์ 3~10์์ ๋
นํ๋ณธ์ผ๋ก ๊ฐ์๋ฅผ ๋ค์๋ฌ๋๋ฐ...
๋ค๋ฅธ๊ฑฐ ํ๋ค๊ฐ 10์ 3๋ถ์์ผ ์๊ฐ์ด ๋๋ฒ๋ ธ๋ค ๐ญ๐ญ๐ญ
๋ง์ง๋ง 6์ฃผ์ฐจ ๋ผ์ด๋ธ ๊ฐ์๋ ์ ๋ ๋์น์ง ๋ง์์ผ์งใ ใ
C์ธ์ด๋ ์งฑ์น์ด ๋๊ฑด ์๋์ง๋ง CS์ ๋ํ ๊ฐ๋
์ ์ก์๊ฐ๋ ๊ฒ ๊ฐ์ ๊ธฐ๋ถ์ด ์ข๋ค
C์ธ์ด๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ฐฐ์ฐ๊ฒ ๋ค! ๋ณด๋ค๋ ๊ธฐ์ด๋ฅผ ๋ค์ง๊ณ ์ถ์ด์ ์์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์,,,,
์ด๋ ๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด์๋ ๊ณต๋ถํ์ผ๋ ์์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ, ๋ฆฌ์กํธ๋ก ๊ฐ๋ฐ์ ํ ๋์๋
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ญ๋นํ๊ณ ์์ง ์์์ง๋ ์ดํด๋ณด๋๋ก ์ฃผ์ํด์ผ ๊ฒ ๋ค ๐ฅ