์๋ก
์ด์ ์คํ ์ค๋ฒ ํ๋ก์ฐ๋ฅผ ํ์ฉํ RET๋ฅผ ๋ณ์กฐํด ์
ธ์ ํ๋ํ๋.. ๊ทธ๋ฐ
์๊ฒ์์ ํด๋ด
์๋ค ์๋๋ ์์ ์์
// Name: rao.c
// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie
#include <stdio.h>
#include <unistd.h>
void init() {
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
}
void get_shell() {
char *cmd = "/bin/sh";
char *args[] = {cmd, NULL};
execve(cmd, args, NULL);
}
int main() {
char buf[0x28];
init();
printf("Input: ");
scanf("%s", buf);
return 0;
}
์ทจ์ฝ์ ๋ถ์
ํ๋ก๊ทธ๋จ์ ์ทจ์ฝ์ ์ scanf("%s", buf)์ ์์ต๋๋ค. scanfํจ์์ ํฌ๋งท ์คํธ๋ง ์ค ํ๋์ธ
%s๋ ๋ฌธ์์ด์ ์
๋ ฅ๋ฐ์ ๋ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก, ์
๋ ฅ ๊ธธ์ด ์ ํํ์ง ์์ผ๋ฉฐ,
๊ณต๋ฐฑ ๋ฌธ์์ธ ๋์ด์ฐ๊ธฐ, ํญ, ๊ฐํ ๋ฌธ์ ๋ฑ์ด ๋ค์ด์ฌ ๋๊น์ง ๊ณ์ ์
๋ ฅ์ ๋ฐ๋๋ค๋ ํน์ง์ด ์ทจ์ฝ์ !
์ด๋ฐ ํน์ง์ผ๋ก ๋ฒํผ ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ ์ ์ค๋ฒํ๋ก์ฐ ๋ฐ์ํจ
๋ฐ๋ผ์ scanf์%s ํฌ๋งท ์คํธ๋ง์ ์ฌ์ฉX ์ ํํ n๊ฐ์ ๋ฌธ์๋ง ์
๋ ฅ๋ฐ๋ "%[n]s"์ ํํ๋ก ์ฌ์ฉํ์ธ์
์ด์ธ์๋, C/C++์ ํ์ค ํจ์ ์ค ๋ฒํผ๋ฅผ ๋ค๋ฃจ๋ฉด์ ๊ธธ์ด ์ ํ์ ์ํ๋ ํจ์๋ ๋๋ถ๋ถ ์ํ์์๋ก์จ,
๋ํ์ ์ผ๋ก strcpy, strcat, sprinf๊ฐ ์์ต๋๋ค. ์ฝ๋ ์์ฑ ์ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ด ์
๋ ฅํ๋
strncpy, strncat, snprintf, fgets, memcpy ๋ฑ์ด ๋ฐ๋์งํ๋ฉฐ ๋ค์ _s๋ฅผ ๋ถ์ด๋ ๋ฐฉ๋ฒ๋ ์กด์ฌ!
์ด ์์ ์์ ํฌ๊ธฐ๊ฐ 0x28(40byte)์ธ ๋ฒํผ์ scanf("%s", buf)๋ก ์ ๋ ฅ ๋ฐ์ผ๋ฏ๋ก BOF ํด๋ด ์๋ค
๐กC/C++์ ๋ฌธ์์ด ์ข ๊ฒฐ์(Terminator)์ ํ์ค ๋ฌธ์์ด ํจ์๋ค์ ์ทจ์ฝ์ฑ
C๊ณ์ด ์ธ์ด๋ ๋๋ฐ์ดํธ("\x00")๋ก ์ข ๋ฃ๋๋ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๋ฌธ์์ด๋ก ์ทจ๊ธํ๋ฉฐ,
๋ฌธ์์ด์ ๋ค๋ฃจ๋ ๋๋ถ๋ถ์ ํ์ค ํจ์๋ ๋๋ฐ์ดํธ๋ฅผ ๋ง๋ ๋๊น์ง ์ฐ์ฐ์ ์งํํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ํ์ค ํจ์์์ ์ ํ์ด ๋๋ ๋๋ฐ์ดํธ๊ฐ ์์ ๊ฒฝ์ฐ ๋ฌธ์์ด ํจ์๋ ๋๋ฐ์ดํธ๋ฅผ
์ฐพ์ ๋๊น์ง ๋ฐฐ์ด์ ์ฐธ์กฐํ๋ฉฐ, ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ ์ํ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋์ด์๋ ๊ณ์ ์ธ๋ฑ์ค ↑
์ด๋ฐ ๋์์ผ๋ก ์ธํด ์ธ๋ฑ์ค ๊ฐ์ด ๋ฐฐ์ด์ ํฌ๊ธฐ๋ณด๋ค ์ปค์ง๋ ํ์ OOB(Index Out-Of-Bound)!
OOB๋ ์ฌ๊ฐํ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค ์์ธํ ๋ถ๋ถ์ ๋ค์์ ๋ฐฐ์ฐ์ฃ
ํธ๋ฆฌ๊ฑฐ๐ซ
์ทจ์ฝ์ ์ ๋ฐํ์ํค๋ ๊ฒ(ํ์)
์์ ๋ฅผ ์ปดํ์ผ ํ ์คํํ๊ณ ํ ์คํธ๋ฅผ ํด๋ด ์๋ค
ํ๋ก๊ทธ๋จ์ด ์ ์ ์ข ๋ฃ๋์์ฃ ๊ทธ๋ผ ์ด์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ํด๋ณผ๊น์
์งง์ ์
๋ ฅ๊ณผ ๋ฌ๋ฆฌ Segment fault๋ผ๋ ์๋ฌ ์ถ๋ ฅ๋๋ฉฐ, ํ๋ก๊ทธ๋จ์ด ๋น์ ์์ ์ข
๋ฃ๋์์ฃ
์ด๋ ํ๋ก๊ทธ๋จ์ด ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ๊ทผํ๋ค๋ ์๋ฏธ๋ฉฐ, ํ๋ก๊ทธ๋จ์ ๋ฒ๊ทธ ๋ฐ์ ์ ํธ!!
์ด ์๋ฌ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ์์..(์ํค๋ฐฑ๊ณผ์์)
๋ค์ (core dumped)๋ ์ฝ์ดํ์ผ(core)์ ์์ฑํ๋ค๋ ๊ฒ์ผ๋ก, ํ๋ก๊ทธ๋จ ๋น์ ์ ์ข
๋ฃ ์
๋๋ฒ๊น
์ ๋๊ธฐ ์ํด OS๊ฐ ์์ฑํ ๊ฒ์
๋๋ค.
์ฝ์ด ํ์ผ์ด ์์ฑ๋์ง ์์์
๋ฆฌ๋ ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ์ด ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์ ํํ๊ธฐ์ ๋ฐ์ด๋๋ฆฌ๊ฐ ์ธ๊ทธ๋จผํธ ํดํธ๋ฅผ
๋ฐ์์ํค๊ณ ๋ ์ฝ์ดํ์ผ์ด ์์ฑ์ด ์๋๋ค๋ฉด ์์ฑํ ์ฝ์ดํ์ผ์ ํฌ๊ธฐ๊ฐ ์ด๊ณผํ๋ค๋ ๋ป!
๋ค์ ์ปค๋งจ๋๋ ๋ฐ์ ๋งํฌ๋ฅผ ํตํด ํ์ธํด๋ณด์ธ์ ์ ๋ ์ข ๋ฒ๊ทธ๊ฐ ์๋๋ผ๊ณ ์
ulimit -c unlimited
์ฝ์ด ํ์ผ ๋ถ์๐
gdb์๋ ์ฝ์ด ํ์ผ์ ๋ถ์ํ๋ ๊ธฐ๋ฅ์ด ์์ฃ ์ด๋ฅผ ํตํด ํ๋์ฉ ๋ถ์ํด๋ด ์๋ค.
๋ค์ ๋ช
๋ น์ด ์ฝ์ด ํ์ผ์ ์ฝ๋๋ค. ํ๋ก๊ทธ๋จ ์ข
๋ฃ์์ธ์ ํ์ธ์ ๋ํ๋ด๋ฉฐ,
์ด๋ค ์ฃผ์์ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ค ๋ฌธ์ ๋ฐ์ํ๋์ง ์๋ ค์ค
Context์์ DISAM ์ฝ๋์ ์คํ์ ๊ด์ฐฐํ๋ฉด, ํ๋ก๊ทธ๋จ์ด mainํจ์์์ ๋ฐํํ๋ คํ๋๋ฐ,
์คํ ์ต์๋จ์ ์ ์ฅ๋ ๊ฐ์ด ์
๋ ฅ๊ฐ์ ์ผ๋ถ์ธ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด๋ ์คํ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๊ฐ ์๋๋ฏ๋ก ์ธ๊ทธ๋จผํ
์ด์
ํดํธ ๋ฐ์!!
์ด ๊ฐ์ด ์ํ๋ ์ฝ๋ ์ฃผ์๊ฐ ๋๋๋ก ์ ์ ํ ์
๋ ฅ์ ์ฃผ๋ฉด, mainํจ์์์ ๋ฐํ ์ expoit ๊ฐ๋ฅ
์ต์คํ๋ก์
1. ์คํ ํ๋ ์ ๊ตฌ์กฐ ํ์
์คํ ๋ฒํผ์ ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ฐ์ ํด ๋ฐํ์ฃผ์๋ฅผ ๋ฎ์ผ๋ ค๋ฉด, ์ฐ์ ํด๋น ๋ฒํผ๊ฐ ์คํ ํ๋ ์
์ด๋์ ์์นํ๋์ง ์กฐ์ฌํด์ผํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ค๊น์?
scanf ํจ์๊ฐ ์ทจ์ฝํ๋ฏ๋ก ๊ทธ ์ด์ ๊ฐ๋ง ํธ์ถํ ๋ถ๋ถ์ชฝ์ผ๋ก ๋ค์ด๊ฐ์๋น
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์์ฌ ์ฝ๋๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค
scanf("%s", (rbp-0x30));
์ฆ, ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ฐ์์ํฌ ๋ฒํผ๋ rbp-0x30์ ์์นํฉ๋๋ค.
์คํ ํ๋ ์์ ๊ตฌ์กฐ๋ฅผ ๋ ์ฌ๋ ค ๋ณด๋ฉด, rbp์ SFP๊ฐ ์ ์ฅ๋๊ณ , rbp+0x8์๋ ๋ฐํ ์ฃผ์ ์ ์ฅ๋จ
์
๋ ฅํ ๋ฒํผ์ ๋ฐํ ์ฃผ์ ์ฌ์ด์ 0x38๋งํผ์ ๊ฑฐ๋ฆฌ๊ฐ ์์ผ๋ฏ๋ก, ๊ทธ๋งํผ์ dummy data๋ก ์ฑ์ฐ๊ณ ,
์คํํ๊ณ ์ ํ๋ ์ฝ๋์ ์ฃผ์๋ฅผ ์
๋ ฅํ๋ฉด ์คํ ํ๋ฆ์ ์กฐ์ํ ์ ์์
get_shell() ์ฃผ์ ํ์ธ
์ด ์์ ์์ ์
ธ์ ์คํํด์ฃผ๋ get_shell() ํจ์๊ฐ ์์ผ๋ฏ๋ก,
์ด ํจ์์ ์ฃผ์๋ก mainํจ์์ ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ์ด์ ์
ธ์ ํ๋ํ ์ ์์
get_shell()์ ์ฃผ์๋ฅผ ์ฐพ๊ธฐ ์ํด gdb๋ฅผ ์ฌ์ฉํฉ๋๋ค.
get_shell()์ ์ฃผ์๊ฐ 0x401199์์ ํ์ธํ์ต๋๋ค.
ํ์ด๋ก๋ ๊ตฌ์ฑ
์ด์ expoit์ ์ฌ์ฉํ payload๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
์์คํ
ํดํน์์ ํ์ด๋ก๋๋ ๊ณต๊ฒฉ์ ์ํด ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธ
์๋์ธ ์ ์ฉ
๊ตฌ์ฑํ ํ์ด๋ก๋๋ ์ ์ ํ ์๋์ธ(Endian)์ ์ ์ฉํด ํ๋ก๊ทธ๋จ์ ์ ๋ฌํด์ผ ํด์
์๋์ธ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋๋ ๋ฐฉ์์ผ๋ก ์ฃผ๋ก
๋ฆฌํ ์๋์ธ(Little-Endian, LE)๊ณผ ๋น
์๋์ธ(Big-Endian, BE)์ด ์ฌ์ฉ๋ฉ๋๋ค.
๋ฆฌํ ์๋์ธ์์๋ ๋ฐ์ดํฐ์ Most Significant Byte(MSB; ๊ฐ์ฅ ์ผ์ชฝ์ ๋ฐ์ดํธ)๊ฐ ๊ฐ์ฅ ๋์ ์ฃผ์๋ก
๋น
์ํฐ์ธ์์ ๋ฐ์ดํฐ์ MSB๊ฐ ๊ฐ์ฅ ๋ฎ์ ์ฃผ์๋ก ์ ์ฅ๋ฉ๋๋ค.
์ต์คํ๋ก์์ ์์ฑํ ๋ ๋์ ์์คํ
์ ์๋์ธ์ ๊ณ ๋ คํด์ผํ๋ ์ด์ ๊ฒ ์ฃ
์ ๋ฆฌํ ์๋์ธ์ธ x64์ํคํ
์ฒ ๊ธฐ๋ฐ์ ๋์์ผ๋ก ํ๋ฏ๋ก
get_shell()์ ์ฃผ์์ธ 0x401199๋ "\x99\x11\x40\x00\x00\x00\x00\x00"๋ก ์ ๋ฌ ๋์ผ๊ฒ ์ฃ
// Name: endian.c
// Compile: gcc -o endian endian.c
#include <stdio.h>
int main() {
unsigned long long n = 0x4005a7;
printf("Low <-----------------------> High\n");
for (int i = 0; i < 8; i++) printf("0x%hhx ", *((unsigned char*)(&n) + i));
return 0;
}
์ ์ฝ๋๋ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง ํ์ธ ์ฉ๋๊ฐ๋ค์
์ด์์ด๋ฉด ์ง์ ์ง์๋๊ฒ๋ ์ข๊ณ ๊ทธ๋ฅ ํ์ธ๋ง ํ์
๋ ์ข์ ๋ฏ ํ๋ค์
์ต์คํ๋ก์
์๋์ธ์ ์ ์ฉํ์ฌ ํ์ด๋ก๋๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ๋ค์ ์ปค๋งจ๋๋ก rao์ ์ ๋ฌํ๋ฉด ์
ธ ํ๋!
$ (python -c "import sys;sys.stdout.buffer.write(b'A'*0x30 + b'B'*0x8 + b'\xa7\x05\x40\x00\x00\x00\x00\x00')";cat)| ./rao
์ทจ์ฝ์ ํจ์น
์ทจ์ฝ์ ์ ๋ฐ๊ฒฌํ๋ ๋ฐฉ๋ฒ๋งํผ ์ค์ํ ๊ฒ์ด ์ทจ์ฝ์ ํจ์น์
๋๋ค ์์ผ๋ก ๋ถ์กฑํ๋๋ง
์ ๊ฐ์ ์ธ์ ๋ณดํธ๊ธฐ๋ฒ๋ ๊ธฐ์ฌํด๋ณด๊ฒ ์ต๋๋ค! ์ด๋ฒ์ ๋ ๋จนํ ๊ป์ ํํ
rao
rao์์๋ ์ํํ ๋ฌธ์์ด ์
๋ ฅํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ทจ์ฝ์ ์ด ๋ฐ์ํ์ต๋๋ค.
ํด๋น ์ทจ์ฝ์ ์ ํจ์นํ๊ธฐ์ํด C์ธ์ด์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฌธ์์ด ์
๋ ฅ ํจ์์ ํจํด๋ค์ ์ดํด๋ณด๊ณ ,
๊ฐ๊ฐ์ ํน์ง์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
basic_exploitation_001 (0) | 2022.04.27 |
---|---|
basic_exploitation_000 (0) | 2022.04.27 |
Return Address Overwrite (0) | 2022.04.25 |
Memory Corruption: Stack Buffer Overflow (0) | 2022.04.21 |
Background: Calling Convention (0) | 2022.04.20 |