๐ง ๋ฒํผ ์ค๋ฒํ๋ก์ฐ
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค๋ฃจ๋ ๋ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์๋ชป๋ ๋์์ ํ๋ ํ๋ก๊ทธ๋จ ์ทจ์ฝ์ ์ ์๋ฏธํฉ๋๋ค.
C์์๋ ๋ฐฐ์ด ์ฐธ์กฐ ์ ๋ฒ์๋ฅผ ์ฒดํฌํ์ง ์์ผ๋ฉฐ, ์ง์ญ๋ณ์๋ค์ด ๋ณด์กด์ฉ ๋ ์ง์คํฐ์ ๋ฆฌํด ์ฃผ์ ๊ฐ์ ์ ๋ณด๋ค๊ณผ ํจ๊ป ์คํ์ ์ ์ฅ๋๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค.
์ด๋ฌํ ์กฐํฉ ๋๋ฌธ์ ์ฌ๊ฐํ ํ๋ก๊ทธ๋จ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋๋ฐ, ์คํ์ ์ ์ฅ๋ ์ํ์ ๋ณด๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ฐฐ์ด์ ์์์ ๋ํ ์ฐ๊ธฐ ์์ ์ ์ํ์ฌ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์ ๋๋ค.
๊ทธ๋ฌ๊ณ ๋์ ํ๋ก๊ทธ๋จ์ด ๋ ์ง์คํฐ ๊ฐ์ ๋ค์ ์ ์ฌํ๊ฑฐ๋, ์ด๋ ๊ฒ ๋ณ๊ฒฝ๋ ์ํ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ret ์ธ์คํธ๋ญ์ ์ ์คํํ ๋ ๋ฒ๊ทธ๋ฅผ ๋ฐ์์ํต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด์ ํ ๋น๋ ํฌ๊ธฐ ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํํ ํํ๋ก๋ ์คํธ๋ง ์ ๋ ฅ์ ๊ธธ์ด๋ฅผ ์ฒดํฌํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์๋๋ gets ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ๊ตฌํ์ ๋๋ค.
char * gets(char * dest)
{
int c = getc();
char * p = dest;
while(c != EOF && c != '\n') {
*p ++ = c;
c = getc();
}
*p = '\0';
return dest;
}
ํ์ค ์ ๋ ฅ์ผ๋ก๋ถํฐ ํ ์ค์ ์ฝ์ด๋ค์ด๊ณ ์ํฐ ํค๋ ์ค๋ฅ์ํฉ์ด ๋ฐ์ํ์ ๋ ๋ฉ์ถ๋ ํจ์์ ๋๋ค.
๋ค์์ ์ด๋ฅผ ์ฌ์ฉํ๋ echo ํจ์์ ๋๋ค.
void echo()
{
char buf[4];
gets(buf);
puts(buf);
}
์ echo ์ฝ๋์์ ์๋์ ์ผ๋ก ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๋งค์ฐ ์๊ฒ ์ค์ ํ์์ต๋๋ค.
๋ฌธ์์ด์ ๋ง์ง๋ง์ '\0'์ผ๋ก ์ฑ์์ง๋ฏ๋ก, ๊ธธ์ด๊ฐ 3๋ฐ์ดํธ๋ณด๋ค ๋ ๊ธด ๋ฌธ์์ด๋ค์ ๋ชจ๋ ๋ฒ์๋ฅผ ์ด๊ณผํ์ฌ ๋ฒํผ์ ์ฐ์ฌ์ง๋๋ค.
int call_echo()
{
printf("Type a string");
echo():
return 0;
}
์ด์ ์ด ๋ ํจ์๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ณํํ์ฌ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<call_echo>:
4006e8: sub $0x8, %rsp
4006ec: mov $0x0, $eax
4006f1: callq 4006cf <echo>
4006f6: add $0x8, %rsp
4006fa: retq
<echo>:
4006cf: sub $0x18, %rsp
4006d3: mov %rsp, %rdi
4006d6: callq 400680 <gets>
4006db: mov %rsp, %rdi
4006de: callq 400520 <puts@ptl>
4006e3: add $0x18, %rsp
4006e7: retq
ํ๋ก๊ทธ๋จ์ 24๋ฐ์ดํธ ๋งํผ ์คํ์ ํ ๋นํฉ๋๋ค.
echo์์๋ gets์ puts ํธ์ถ ์ ์ธ์๋ก ์ฌ์ฉํ๊ธฐ ์ํด %rsp๊ฐ %rdi๋ก ๋ณต์ฌ๋๋ค๋ ์ฌ์ค์ ์ ์ ์์ต๋๋ค.
buf์ ์ ์ฅ๋ ๋ฆฌํด ํฌ์ธํฐ ์ฌ์ด์ 20๋ฐ์ดํธ๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์ฆ ํ์ฌ ์คํ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ ๋ง์ฝ ์ ๋ ฅ ์คํธ๋ง์ด 24๋ฐ์ดํธ๊ฐ ๋ค์ด์จ ๊ฒฝ์ฐ, ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ ๋ฐ์ํ์ง๋ง, return address๋ ๋ณํ์ํค์ง ์์ผ๋ฏ๋ก, ๋ฌธ์ ์์ด ๋์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ ์ด์์ ์คํธ๋ง์ด ๋ค์ด์ค๋ ๊ฒฝ์ฐ์๋ return address๊น์ง ์์์์ผ ์ ํ ์์ํ์ง ๋ชปํ ๊ณณ์ผ๋ก ์ ํํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
๐ง exploit code
์ปดํจํฐ์ ์ํํธ์จ์ด ๋ฒ๊ทธ, ๋ณด์ ์ทจ์ฝ์ ๋ฑ ์ค๊ณ์ ๊ฒฐํจ์ ์ด์ฉํด ๊ณต๊ฒฉ์์ ์๋๋ ๋์์ ์ํํ๋๋ก ๋ง๋๋ ์ฝ๋๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํตํด ์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ํ์ง ์์ ๊ธฐ๋ฅ๋ค์ ์คํํ๋๋ก ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ปดํจํฐ ๋คํธ์ํฌ ์์ ์์คํ ๋ณด์์ฑ์ ๊ณต๊ฒฉํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ ์ค์ ํ๋์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก exploit code๋ผ๊ณ ํ๋ ์คํ์ฝ๋๋ฅผ ๋ฐ์ดํธ ์ธ์ฝ๋ฉํ์ฌ,
exploit code๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก ๋ฆฌํด ์ฃผ์๋ฅผ ๋ฎ์ด์ฐ๋ ์ฝ๊ฐ์ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํธ๋ค์ ํฌํจํ๋ ๋ฌธ์์ด์ ์ ๋ ฅํฉ๋๋ค.
์ดํ ret ์ธ์คํธ๋ญ์ ์ด ์คํ๋๋ฉด exploit code๋ก ์ ํํ๊ฒ ๋ฉ๋๋ค.
๐ง ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๋์ ๊ธฐ๋ฒ
์ต์ ์ปดํ์ผ๋ฌ์ ์ด์์ฒด์ ๋ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๊ณต๊ฒฉ์ด ์คํ๋๊ธฐ ์ด๋ ต๊ฒ ํ๋ ๋ฐฉ๋ฒ๊ณผ,
์นจ์ ์๊ฐ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๊ณต๊ฒฉ์ ํตํด์ ์์คํ ์ ์ ์ด๊ถ์ ํ๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๊ตฌํํ์์ต๋๋ค.
โญ๏ธ ์คํ ๋๋คํ
๊ณต๊ฒฉ์๋ exploit code๋ฅผ ์์คํ ์ ์ฝ์ ํ๊ธฐ ์ํด์, ๊ณต๊ฒฉํ๊ธฐ ์ํ ์คํธ๋ง ๋ด์ ์ฝ๋๋ฟ๋ง ์๋๋ผ ์ฝ๋๋ก์ ํฌ์ธํฐ๊น์ง ์ง์ด๋ฃ์ด์ผ ํฉ๋๋ค.
์ด ํฌ์ธํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ์คํธ๋ง์ด ์์นํ๊ฒ ๋ ์คํ์ ์ฃผ์๋ฅผ ์์์ผ ํฉ๋๋ค.
์์ ์๋ ์คํ์ ์ฃผ์๋ฅผ ์ฝ๊ฒ ์์ธกํ ์ ์์์ต๋๋ค.
๋์ผํ ํ๋ก๊ทธ๋จ๊ณผ ์ด์์ฒด์ ๋ฒ์ ์ ์คํํ๋ ๋ชจ๋ ์์คํ ์์ ์คํ์ ์์น๋ ์ปดํจํฐ ๊ฐ์ ๋งค์ฐ ์์ ์ ์ธ ๊ฐ์ ๊ฐ์ต๋๋ค.
์คํ ๋๋คํ์ ์์ด๋์ด๋ ์คํ์ ์์น๋ฅผ ํ๋ก๊ทธ๋จ์ ๋งค ์คํ๋ง๋ค ๋ค๋ฅด๊ฒ ํด์ฃผ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ๋น๋ก ๋ง์ ์ปดํจํฐ๊ฐ ๋์ผํ ์ฝ๋๋ฅผ ์คํํ๊ณ ์์์ง๋ผ๋, ์ด๋ค์ ๋ชจ๋ ์์ ํ ๋ค๋ฅธ ์คํ ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
โญ๏ธ ์คํ ์์ ๊ฒ์ถ
์คํ์ ์นด๋๋ฆฌ(canary) ๊ฐ์ ์ฝ์ ํ์ฌ ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์๋ฐฉํฉ๋๋ค.
์คํ์ด ์์๋๋ ๊ฒ์ ๊ฐ์งํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋์ํ ์ ์์ต๋๋ค.
echo ํจ์์ ์์ ์์ ์์์ด ๋๊ฐ ํ๋ก๊ทธ๋จ์ด ์ง์ญ ๋ฒํผ์ ๊ฒฝ๊ณ๋ฅผ ๋ฒ์ด๋ ๋ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
C์์ ๋ฐฐ์ด์ ๊ฒฝ๊ณ๋ฅผ ๋๋ ์ฐ๊ธฐ ์์ ์ ๋ฐฉ์งํ๋ ์์ ์ ์ธ ๋ฐฉ๋ฒ์ ์กด์ฌํ์ง ์์ต๋๋ค.
๋์ , ํ๋ก๊ทธ๋จ์ ํด๋ก์ด ํจ๊ณผ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ์ด๋ฌํ ์ฐ๊ธฐ ์์ ์ด ๋ฐ์ํ๋ ๊ฒ์ ๊ฐ์งํ๋ ์๋๋ฅผ ํ ์ ์์ต๋๋ค.
GCC์์๋ ์คํ ๋ณดํธ ์ฝ๋๋ฅผ ์์ฑ๋ ์ฝ๋์ ์ถ๊ฐํ๋ ๊ธฐ๋ฒ์ ๊ตฌํํฉ๋๋ค.
์ด ์์ด๋์ด๋ ์ง์ญ ๋ฒํผ์ ๋๋จธ์ง ์คํ ์ํ ๊ฐ ์ฌ์ด์ ํน๋ณํ ์นด๋๋ฆฌ(canary) ๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ ๋๋ค.
์ด ์นด๋๋ฆฌ ๊ฐ์ ๋ณดํธ๊ฐ(guard value)์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, ํ๋ก๊ทธ๋จ์ ๋งค ์คํ๋ง๋ค ๋๋ค์ผ๋ก ์์ฑ๋๋ฏ๋ก ๊ณต๊ฒฉ์๊ฐ ๊ฐ์ ์ฝ๊ฒ ์ถ์ ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๋ ์ง์คํฐ ์ํ๋ฅผ ๋ณต์ํ๊ณ ํจ์๋ก๋ถํฐ ๋ฆฌํดํ๊ธฐ ์ ์ ํ๋ก๊ทธ๋จ์ ์นด๋๋ฆฌ ๊ฐ์ด ์ด ํจ์๋, ํธ์ถํ ํจ์์ ๋์์ ์ํด ๋ณ๊ฒฝ๋์๋์ง๋ฅผ ์ฒดํฌํฉ๋๋ค.
๋ง์ผ ๋ณ๊ฒฝ๋์๋ค๋ฉด, ํ๋ก๊ทธ๋จ์ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ฉด์ ์ข ๋ฃํฉ๋๋ค.
๋ค์์ ๊ทธ ์์์ ๋๋ค.
โญ๏ธ ์คํ์ฝ๋ ์์ญ ์ ํํ๊ธฐ
๋ง์ง๋ง ๋ฐฉ๋ฒ์ ๊ณต๊ฒฉ์๊ฐ exploit code ๋ฅผ ์์คํ ์ ์ถ๊ฐํ ๊ฐ๋ฅ์ฑ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค.
ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์คํ์ฝ๋๋ฅผ ์ ์ฅํ ์ง๋ฅผ ์ ํํ๋ ๊ฒ์ ๋๋ค.
์ผ๋ฐ์ ์ ํ๋ก๊ทธ๋จ์์ ์ปดํ์ผ๋ฌ๊ฐ ๋ง๋ ์ฝ๋๋ฅผ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ถ๋ง์ด ์คํ ๊ฐ๋ฅํ๋ฉด ๋ฉ๋๋ค.
์์ธํ ๋ค๋ฃจ์ง๋ ์๊ฒ ์ง๋ง ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ๋ค์ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ง ํ์ฉํ๋๋ก ์ ํํ์ฌ, ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ก๋ถํฐ ๋ณดํธํ ์ ์์ต๋๋ค.
'๐ฅ Computer Science > ์์คํ ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ํ๋ก์ธ์ค [1] - ํ๋ก์ธ์ค (0) | 2022.11.07 |
---|---|
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ํ๋ก์ธ์ค [0] - ์ ์ด ํ๋ฆ๊ณผ ์์ธ ์ํฉ (0) | 2022.11.07 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] 2022 BombLab(๋ฐค๋ฉ) ์์ธ๋ถ์ (0) | 2022.10.24 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ์ด์ ๋ธ๋ฆฌ์ด[4] - ํ๋ก์์ (0) | 2022.10.24 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ์ด์ ๋ธ๋ฆฌ์ด[3] - ๋ฐ๋ณต๋ฌธ (0) | 2022.10.13 |