์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ(Stack Buffer Overflow)
์ธ๊ณ ์ต์ด์ ์์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ชจ๋ฆฌ์ค ์๋ ์ด ๊ณต๊ฒฉ์ ํตํด ์ ํ๋จ
๋ณด์ ๊ณต๋ถ๋ฅผ ๋ชจ๋ฅด๋ ๊ฐ๋ฐ์๋ ์๋งํผ ์ ๋ช
ํ๊ณ ์ญ์ฌ๊ฐ ์ค๋๋ ์ทจ์ฝ์ ์
๋๋ค.
์ด๋ ๊ฒ ์ค๋ ์ญ์ฌ๋ฅผ ์๋ํ๋ ์ด ์ทจ์ฝ์ ์ ์์ง๋ ๋ง์ SW์์ ๋ฐ๊ฒฌ๋ฉ๋๋ค.
CVE details์ ๋ฐ๋ฅด๋ฉด ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํฌํจํ ์ค๋ฒํ๋ก์ฐ ์ทจ์ฝ์ ์ ๋ง์ด ๋์์(4์)
๊ทธ๋ผ ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ ์์ธ์ด ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ด ์ทจ์ฝ์ ์ด ์ด๋ค ๋ฌธ์ ๋ก ์ด์ด์ง์ง ๊ณต๋ถ ใฑ
BOF์ ํ์ํ ์ฉ์ด ๊ฐ๋จ ์ ๋ฆฌ
- ๋ฒํผ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ
- sfp๋ ์คํ ๋ฒ ์ด์ค ๊ฐ์ ์๋ฏธ
- sfp๋ ์คํ ์ฃผ์๊ฐ์ ๊ณ์ฐํ ๋ ํ์ฌ ์คํ๊ฐ์ ๊ธฐ์ค ํ์ํ
ํ๋ ์ ํฌ์ธํฐ ๊ฐ ์ง์ (4 or 8byte) rbp(or ebp)๋ ํ ๊ฐ๋ผ ํจ์ ์์๋๋ง๋ค ๋ฐ๋๋๋ฐ
๊ทธ ์ ์ ebp๊ฐ์ ์คํ์ ์ ์ฅ ๋๋ฌธ์ ํ์ - ret๋ return address ์ฝ์ด
- ํจ์ ๋ฐํ ์ ์๋ ํ๋ฆ๋๋ก ๊ฐ๊ธฐ ์ํด ํ์ ์ฌ๊ธฐ๋ฅผ ๋ฎ์ด๋ฒ๋ฆฌ๋ฉด ์์ ์ด ์ํ๋๋ฐ๋ก ๊ฐ๋ฅํด์ง
๊ทธ๋ฌ๊ธฐ์ ๋งค์ฐ ์ค์ํ์ฃ
์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ
์คํ์ ๋ฒํผ์์ ๋ฐ์ํ๋ ์ค๋ฒ ํ๋ก์ฐ๋ฅผ ๋ปํจ
๋ฒํผ(Buffer)
์ผ์์์ '์์ถฉ ์ฅ์น'๋ผ๋ ๋ป
CS(Computer Science)์์ ๋ฐ์ดํฐ๊ฐ ๋ชฉ์ ์ง๋ก ์ด๋ํ๊ธฐ ์ ์ ๋ณด๊ด๋๋ ์์ ์ ์ฅ์
์์ ์ธก๊ณผ ์ก์ ์ธก ์ฌ์ด์ ๋ฒํผ๋ผ๋ ์์ ์ ์ฅ์๋ฅผ ๋๊ณ , ์ด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํจ
์ก์ ์ธก์ ๋ฒํผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ , ์์ ์ธก์ ๋ฒํผ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ์ฌ์ฉํจ
์ด๋ ๊ฒํ๋ฉด ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐฐ ๋๊น์ง ์ ์ค๋๋ ๋ฐ์ดํฐ ์์ด ํต์ ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋น ๋ฅธ ์๋๋ก ์ด๋ํ๋ ๋ฐ์ดํฐ๊ฐ ์์ ์ ์ผ๋ก ๋ชฉ์ ์ง์ ๋๋ฌํ ์ ์๋๋ก ์์ถฉ ์์ฉ์ ํ๋ ๊ฒ์ด ๋ฒํผ์ ์ญํ !
์คํ์ ์๋ ์ง์ญ ๋ณ์๋ '์คํ ๋ฒํผ' / ํ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ 'ํ ๋ฒํผ'๋ผ๊ณ ๋ถ๋ฆผ
๐ฆ๋ฒํผ๋ง
์ด๋ ๋ฒํผ์์ ์ ๋๋ ๋จ์ด๋ก, ์ก์ ์ธก์ ์ ์ก ์๋๊ฐ ๋๋ ค์ ์์ ์ธก์ ๋ฒํผ๊ฐ
์ฑ์์ง ๋๊น์ง ๋๊ธฐํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค
๋ฒํผ ์ค๋ฒํ๋ก์ฐ(Buffer Overflow)
๋ฌธ์ ๊ทธ๋๋ก ๋ฒํผ๊ฐ ๋์น๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ๋ฒํผ๋ ์ ๊ฐ๊ธฐ ํฌ๊ธฐ๋ฅผ ์ง๋
๋ฐ์ดํฐ ํ์
์ ํฌ๊ธฐ๋ฅผ ์ง๋๋ฉฐ, ๊ทธ ํฌ๊ธฐ๋ฅผ ๋๋ ๋ฐ์ดํฐ ๊ฐ์ด ์ฌ๋ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๋ฐ์
์ผ๋ฐ์ ์ผ๋ก ๋ฒํผ๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ์ํด ํ ๋น๋์ด ์์ผ๋ฏ๋ก, ์ด๋ค ๋ฒํผ์์ ์ค๋ฒํ๋ก์ฐ ๋ฐ์ํ๋ฉด,
๋ค์ ์๋ ๋ฒํผ๋ค์ ๊ฐ์ด ์กฐ์๋ ์ํ์ด ์์ต๋๋ค.
๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ ๋ณดํต์ ๊ฒฝ์ฐ ๋งค์ฐ ์ฌ๊ฐํ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์์ธํ ์์๋ณด์ฃ
์ค์ ๋ฐ์ดํฐ ๋ณ์กฐ
BOF(Buffer OverFlow)๊ฐ ๋ฐ์ํ๋ ๋ฒํผ ๋ค์ ์ฃผ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด..
ํด๋น ๋ฐ์ดํฐ๊ฐ ๋ณ์กฐ๋จ์ผ๋ก์จ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
// Name: sbof_auth.c
// Compile: gcc -o sbof_auth sbof_auth.c -fno-stack-protector
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_auth(char *password) {
int auth = 0;
char temp[16];
strncpy(temp, password, strlen(password));
if(!strcmp(temp, "SECRET_PASSWORD"))
auth = 1;
return auth;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: ./sbof_auth ADMIN_PASSWORD\n");
exit(-1);
}
if (check_auth(argv[1]))
printf("Hello Admin!\n");
else
printf("Access Denied!\n");
}
- main ํจ์
- argv[1]์ check_auth ํจ์์ ์ธ์๋ก ์ ๋ฌํ ํ, ๋ฐํ ๊ฐ์ ๋ฐ์์ด
- ๋ฐํ ๊ฐ์ด 0์ด ์๋๋ผ๋ฉด "Hello Admin!"์, 0์ด๋ฉด "Access Denied!"๋ผ๋ ๋ฌธ์์ด ์ถ๋ ฅ
- argv[1]์ check_auth ํจ์์ ์ธ์๋ก ์ ๋ฌํ ํ, ๋ฐํ ๊ฐ์ ๋ฐ์์ด
- check_auth ํจ์
- 16byteํฌ๊ธฐ์ temp๋ฒํผ์ ์
๋ ฅ๋ฐ์ ํจ์ค์๋ ๋ณต์ฌ ํ, ์ด๋ฅผ "SECRET_PASSWORD" ๋ฌธ์์ด๊ณผ ๋น๊ต
- ๋ฌธ์์ด์ด ๊ฐ๋ค๋ฉด auth๋ฅผ 1๋ก ์ค์ ํ๊ณ ๋ฐํํจ - ๐temp์ ํฌ๊ธฐ์ธ 16byte๊ฐ ์๋ ์ธ์๋ก ์ ๋ฌ ์ ์ธ์ ๊ทธ๋๋ก ๋ณต์ฌ
- argv[1]์ 16byte๊ฐ ๋๋ ๋ฌธ์์ด์ด ์ ๋ฌ ์ ์ด๋ค ๋ชจ๋ ๋ณต์ฌํด BOF ๋ฐ์ - auth๋ temp๋ฒํผ์ ๋ค์ ์กด์ฌํ๋ฏ๋ก temp๋ฒํผ์ BOF ๋ฐ์ ์ auth์ ๊ฐ์ด ์์๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋จ
- ์ค์ ์ธ์ฆ ์ฌ๋ถ์๋ ์๊ด์์ด main ํจ์์ if(check_auth(argv[1]))๋ ํญ์ ์ฐธ์ด ๋จ
- 16byteํฌ๊ธฐ์ temp๋ฒํผ์ ์
๋ ฅ๋ฐ์ ํจ์ค์๋ ๋ณต์ฌ ํ, ์ด๋ฅผ "SECRET_PASSWORD" ๋ฌธ์์ด๊ณผ ๋น๊ต
๋ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉฐ ๋ค์ ํ์ธ ํฉ์๋ค.
๋ฐ์ดํฐ ์ ์ถ
C์ธ์ด์์ ์ ์์ ์ธ ๋ฌธ์์ด์ null๋ก ์ข
๊ฒฐ๋๋ฉฐ, ํ์ค ๋ฌธ์์ด ์ถ๋ ฅ ํจ์๋ค์ ๋๋ฐ์ดํธ๋ฅผ ๋ฌธ์์ด ๋์ผ๋ก ์ธ์ํจ
๋ง์ฝ ์ด๋ค ๋ฒํผ์ ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ฐ์์์ผ ๋ค๋ฅธ ๋ฒํผ์์ ์ฌ์ด์ ์๋ ๋๋ฐ์ดํธ๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ๋ฉด, ํด๋น ๋ฒํผ๋ฅผ ์ถ๋ ฅ์์ผ ๋ค๋ฅธ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๊ฒ ๊ฐ๋ฅํด์ง๋๋ค.
ํ๋ํ ๋ฐ์ดํฐ๋ ๊ฐ์ข ๋ณดํธ๊ธฐ๋ฒ์ ์ฐํํ๋๋ฐ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ํด๋น ๋ฐ์ดํฐ ์์ฒด๊ฐ ์ค์ํ ์ ๋ณด!!
123456789101112131415161718 // Name: sbof_leak.c// Compile: gcc -o sbof_leak sbof_leak.c -fno-stack-protector#include <stdio.h>#include <string.h>#include <unistd.h>int main(void) {char secret[16] = "secret message";char barrier[4] = {};char name[8] = {};memset(barrier, 0, 4);printf("Your name: ");read(0, name, 12);printf("Your name is %s.", name);}cs
8byte ํฌ๊ธฐ์ name ๋ฒํผ์์ 12๋ฐ์ดํธ์ ์ ๋ ฅ์ ๋ฐ๊ณ , ์ฝ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ธ secret๋ฒํผ์์ ์ฌ์ด์ barrier๋ผ๋ 4byte์ ๋ ๋ฐฐ์ด์ด ์กด์ฌํ๋๋ฐ, ์ค๋ฒํ๋ก์ฐ ์ด์ฉํ์ฌ ๋ ๋ฐ์ดํธ๋ฅผ ๋ชจ๋ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด secret์ ์ฝ์ ์ ์์ต๋๋ค.
์คํ ํ๋ฆ ์กฐ์
Background: Calling Convention ์ ๋ด์ฉ์ ๋์ง์ด ๋ณด๋ฉด,
ํจ์ ํธ์ถ ์ ๋ฐํ ์ฃผ์๋ฅผ ์คํ์ ์๊ณ ํจ์์์ ๋ฐํ ์ ์ด๋ฅผ ๊บผ๋ด์ด ์๋ ์คํ ํ๋ฆ์ผ๋ก ๋์๊ฐ
์ด๋ฅผ ๋ค์ ์๊ฐํ๋ฉด '์คํ BOF๋ก ๋ฐํ ์ฃผ์(RET)๋ฅผ ์กฐ์ํ๋ฉด ์ด๋จ๊น' ๋ผ๊ณ ์๊ฐํ๊ณ ์ ๊ทผํ๋ฉด
์ค์ ๋ก, ํจ์์ ๋ฐํ ์ฃผ์๋ฅผ ์กฐ์ํ๋ฉด ํ๋ก์ธ์ค์ ์คํ ํ๋ฆ์ ๋ฐ๊ฟ ์ ์์!!
// Name: sbof_ret_overwrite.c
// Compile: gcc -o sbof_ret_overwrite sbof_ret_overwrite.c -fno-stack-protector
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char buf[8];
printf("Overwrite return address with 0x4141414141414141: ");
gets(buf);
return 0;
}
๊ทธ๋ผ main ํจ์์ ๋ฐํ ์ฃผ์๋ฅผ 0x4141414141414141 ๋ก ๋ณ๊ฒฝํด๋ณผ๊น์
๋ง๋ฌด๋ฆฌ
BOF๋ ์ง์ ๋ ๋ฒํผ์ ํฌ๊ธฐ๋ณด๋ค ๋ง์ ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ๋์ด ๋ฐ์ํฉ๋๋ค
๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ณ์กฐ/์ ์ถ, ์คํ ํ๋ฆ ์กฐ์ ๋ฑ์ด ๊ฐ๋ฅ!
์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ ์ญ์ฌ๊ฐ ๊น์ ๋งํผ ๋ค์ํ ๋ณดํธ ๊ธฐ๋ฒ์ด ๋์ค๊ณ ์ฐํํ๋ ๊ธฐ๋ฒ๋ ๋์์ฃ
์ฌ๊ธฐ์ ๊ฐ๋จํ๊ฒ ๋ณดํธ ๊ธฐ๋ฒ๋ง ์ ๊ณ ์ฐจ์ฐจ ์์ธํ ์์๊ฐ๋ด
์๋ค. ๋์ค์ ์์ธํ ์ ๋ฆฌํด์ผํ ๊น์..?
๋ฐฉ์ด ๋ฐฉ์
ํด๋ง๋ค ์งํ ๋๋BOF๋ฅผ ์ต์ ํ๋ ๊ณํ์ผ๋ก ํฌ๊ฒ 3๊ฐ์ง๋ก ๋๋๋ฉด
- ๋ฐ์ํ BOF ํ์ง ๋ฐ ์ ์ฑ์ฝ๋์ ๋ช ๋ น์ด ํฌ์ธํฐ ๋ฆฌ๋ค์ด๋ ์ ์ ๋ฐฉ์ง
- ์ง์ ์ ์ผ๋ก BOF ํ์ง X, ์ ์ฑ์ฝ๋๊ฐ ์คํ์์ ์คํ๋๋ ๊ฒ์ ๋ฐฉ์ง
- ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์ฐพ๋ ๊ฒ์ ์ ๋ขฐํ์ง ๋ชปํ๊ฒ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋คํ
1. ์คํ ์นด๋๋ฆฌ(SFP์ RET ์ฌ์ด์ ๊ฒ์ฆ๊ฐ ์ฝ์ )
2. ์คํ ๋ถ๊ฐ๋ฅ ์คํ(๊ถํ ์ ์ด)
3. ๋๋คํ(ASLR; Address Space Layout Randomize ์ PIE;...)
๊ทธ๋ฌ๊ณ ๋ณด๋ฉด ์ธํฐ๋ท์์ ์ฐฝ๊ณผ ๋ฐฉํจ ๋ชจ๋ ์์ธํ๊ฒ ๋์์๋๋ผ๊ณ ์ ใ
ใ
์ ๋ด์ฉ์ ๋์ค์ ์์ธํ๊ฒ ๋ค์ ์ ๋ฆฌํ ์๊ฐ์ด ์ค๊ฒ ์ฃ
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Exploit Tech: Return Address Overwrite (0) | 2022.04.27 |
---|---|
Return Address Overwrite (0) | 2022.04.25 |
Background: Calling Convention (0) | 2022.04.20 |
shell_basic (0) | 2022.04.19 |
Exploit Tech: Shellcode (0) | 2022.04.15 |