1. ์๋ก
์ปดํจํฐ๋ ํฌ๊ฒ CPU์ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. CPU๋ ์คํํ ๋ช ๋ น์ด์ ๋ช ๋ น์ด ์ฒ๋ฆฌ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ๊ณ , ISA์ ๋ฐ๋ผ ์ด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ค์ผ(Memory Corruption) ์ทจ์ฝ์
๊ณต๊ฒฉ์๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์์ ์ผ๋ก ์กฐ์ํ๋ฉด, ์กฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ์ํด CPU๋ ์๋ชป๋ ๋์์ ํ๊ฒ ๋ฉ๋๋ค. ์์คํ ํดํน์๋ ๋ค์ํ ๊ณต๊ฒฉ ๊ธฐ๋ฒ๋ค์ด ์์ง๋ง, ๋ง์ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ด ๋ฉ๋ชจ๋ฆฌ ์ค์ผ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ค์ผ๊ณผ ๊ด๋ จ๋ ์ทจ์ฝ์
- Stack Buffer Overflow
- Off by One
- Format String Bug
- Double Free Bug
- Use After Free
์ด๋ฅผ ์ดํดํ๊ธฐ ์ํ ๋ฐฐ๊ฒฝ ์ง์์ผ๋ก ๋ฆฌ๋ ์ค ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ(Memory Layout)๊ฐ ํ์ํฉ๋๋ค. ํ๋ก์ธ์ค ๊ฐ์๋ฉ๋ชจ๋ฆฌ์ ๊ฐ ๊ตฌ์ญ์ด ์ด๋ค ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋์ง ์ดํดํจ์ผ๋ก์จ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฒด ๊ตฌ์กฐ์ ๋ํด ํ์ ํด ๋ณผ ์ ์์ต๋๋ค.
๊ฐ์
- ์ฝ๋ ์ธ๊ทธ๋จผํธ
- ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ
- BSS ์ธ๊ทธ๋จผํธ
- ์คํ ์ธ๊ทธ๋จผํธ
- ํ ์ธ๊ทธ๋จผํธ
2. ๋ฆฌ๋ ์ค ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
2.1. ์ธ๊ทธ๋จผํธ๋?
- ์ธ๊ทธ๋จผํธ : ์ ์ฌ๋๋ ๋ฐ์ดํฐ์ ์ฉ๋๋ณ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๊ตฌํ์ ๋๋ ๊ฒ
๋ฆฌ๋ ์ค์์๋ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธ๊ทธ๋จผํธ(Segment)๋ก ๊ตฌ๋ถํฉ๋๋ค. ํฌ๊ฒ 5๊ฐ์ง๋ก, ์ฝ๋ ์ธ๊ทธ๋จผํธ, ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ, BSS ์ธ๊ทธ๋จผํธ, ํ ์ธ๊ทธ๋จผํธ, ์คํ ์ธ๊ทธ๋จผํธ์ ๋๋ค.
์ธ๊ทธ๋จผํธ์ ์ฅ์
์ด์์ฒด์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฉ๋๋ณ๋ก ๋๋๋ฉด, ๊ฐ ์ฉ๋์ ๋ง๊ฒ ์ ์ ํ ๊ถํ์ ๋ถ์ฌํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ๊ถํ์ ์ฝ๊ธฐ, ์ฐ๊ธฐ, ์คํ์ด ์์ผ๋ฉฐ CPU๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ๊ถํ์ด ๋ถ์ฌ๋ ํ์๋ง ํ ์ ์์ต๋๋ค.
(์ธ๊ทธ๋จผํธ๋ฅผ ์์ธํ ์ดํดํ๋ ค๋ฉด, ์ด์์ฒด์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ธฐ๋ฒ ์ค ํ๋์ธ ์ธ๊ทธ๋จผํ ์ด์ ๊ธฐ๋ฒ๊ณผ ์ธํ x86-64(x64)์์ ๊ด๋ จ๋ ํ๋์จ์ด์ ์ค๊ณ๋ฅผ ์กฐ๊ธ ์์์ผ ํฉ๋๋ค.)

2.2. ์ฝ๋ ์ธ๊ทธ๋จผํธ
- ์ฝ๋ ์ธ๊ทธ๋จผํธ(Code Segment) : ์คํ ๊ฐ๋ฅํ ๊ธฐ๊ณ ์ฝ๋๊ฐ ์์นํ๋ ์์ญ
= ํ ์คํธ ์ธ๊ทธ๋จผํธ(Text Segment)
์ฝ๋ ์ธ๊ทธ๋จผํธ์ ๊ถํ
- ์ฝ๊ธฐ ๊ถํ, ์คํ ๊ถํ : ํ๋ก๊ทธ๋จ์ด ๋์ํ๋ ค๋ฉด ์ฝ๋๋ฅผ ์คํํ ์ ์์ด์ผ ํ๋ฏ๋ก ๋ถ์ฌ
- ์ฐ๊ธฐ ๊ถํ : ๊ณต๊ฒฉ์๊ฐ ์ ์์ ์ธ ์ฝ๋๋ฅผ ์ฝ์ ํ๊ธฐ๊ฐ ์ฌ์์ง๋ฏ๋ก, ์ฐ๊ธฐ ๊ถํ ์ ๊ฑฐ
์์
์๋์์ ์ ์ 31337์ ๋ฐํํ๋ mainํจ์๊ฐ ์ปดํ์ผ ๋๋ฉด 554889e5b8697a00005dc3๋ผ๋ ๊ธฐ๊ณ ์ฝ๋๋ก ๋ณํ๋๋๋ฐ, ์ด ๊ธฐ๊ณ ์ฝ๋๊ฐ ์ฝ๋ ์ธ๊ทธ๋จผํธ์ ์์นํ๊ฒ ๋ฉ๋๋ค.
int main() { return 31337; }
2.3. ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ
- ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ(Data Segment) : ์ปดํ์ผ ์์ ์ ๊ฐ์ด ์ ํด์ง ์ ์ญ ๋ณ์ ๋ฐ ์ ์ญ ์์๋ค์ด ์์นํ๋ ์์ญ
๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ๊ถํ
- ์ฝ๊ธฐ ๊ถํ : CPU๊ฐ ์ด ์ธ๊ทธ๋จผํธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ด์ผ ํ๋ฏ๋ก ๋ถ์ฌ
- ์ฐ๊ธฐ ๊ถํ : data ์ธ๊ทธ๋จผํธ
- ์ ์ญ ๋ณ์์ ๊ฐ์ด ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ฉด์ ๊ฐ์ด ๋ณํ ์ ์๋ ๋ฐ์ดํฐ - ์ฐ๊ธฐ ๊ถํ ์์ : rodata(read-only data) ์ธ๊ทธ๋จผํธ
- ์ ์ญ์ผ๋ก ์ ์ธ๋ ์์ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ฉด์ ๊ฐ์ด ๋ณํ๋ฉด ์ ๋๋ ๋ฐ์ดํฐ
- ์ฐ๊ธฐ ๊ถํ : data ์ธ๊ทธ๋จผํธ
์์
์๋๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ํฌํจ๋๋ ์ฌ๋ฌ ๋ฐ์ดํฐ์ ์ ํ์ ๋๋ค. ์ฃผ์ ๊น๊ฒ ์ดํด๋ด์ผ ํ ๋ณ์๋ str_ptr์ ๋๋ค. str_ptr์ “ readonly”๋ผ๋ ๋ฌธ์์ด์ ๊ฐ๋ฆฌํค๊ณ ์๋๋ฐ, ์ด ๋ฌธ์์ด์ ์์ ๋ฌธ์์ด๋ก ์ทจ๊ธ๋์ด rodata์ ์์นํ๋ฉฐ, ์ด๋ฅผ ๊ฐ๋ฆฌํค๋ str_ptr์ ์ ์ญ ๋ณ์๋ก์ data์ ์์นํฉ๋๋ค.
int data_num = 31337; // data
char data_rwstr[] = "writable_data"; // data
const char data_rostr[] = "readonly_data"; // rodata
char *str_ptr = "readonly"; // str_ptr์ data, ๋ฌธ์์ด์ rodata
int main() { ... }
2.4. BSS ์ธ๊ทธ๋จผํธ
- BSS ์ธ๊ทธ๋จผํธ(BSS Segment, Block Started By Symbol Segment) : ์ปดํ์ผ ์์ ์ ๊ฐ์ด ์ ํด์ง์ง ์์ ์ ์ญ ๋ณ์๊ฐ ์์นํ๋ ์์ญ
- ์ ์ธ๋ง ํ๊ณ ์ด๊ธฐํํ์ง ์์ ์ ์ญ๋ณ์ ๋ฑ
BSS ์ธ๊ทธ๋จผํธ์ ๊ถํ
- ์ฝ๊ธฐ ๊ถํ, ์ฐ๊ธฐ ๊ถํ
์ด ์ธ๊ทธ๋จผํธ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ๋ก๊ทธ๋จ์ด ์์๋ ๋, ๋ชจ๋ 0์ผ๋ก ๊ฐ์ด ์ด๊ธฐํ๋ฉ๋๋ค. ์ด๋ฐ ํน์ฑ ๋๋ฌธ์ C ์ฝ๋๋ฅผ ์์ฑํ ๋, ์ด๊ธฐํ๋์ง ์์ ์ ์ญ ๋ณ์์ ๊ฐ์ 0์ด ๋ฉ๋๋ค.
์์
์๋ ์ฝ๋์์ ์ด๊ธฐํ๋์ง ์์ ์ ์ญ ๋ณ์์ธ bss_data๊ฐ BSS ์ธ๊ทธ๋จผํธ์ ์์นํ๊ฒ ๋ฉ๋๋ค.
int bss_data;
int main() {
printf("%d\n", bss_data); // 0
return 0;
}
2.5. ์คํ ์ธ๊ทธ๋จผํธ
- ์คํ ์ธ๊ทธ๋จผํธ(Stack Segment) : ํ๋ก์ธ์ค์ ์คํ์ด ์์นํ๋ ์์ญ
- ํจ์์ ์ธ์๋ ์ง์ญ ๋ณ์์ ๊ฐ์ ์์ ๋ณ์๋ค์ด ์คํ ์ค์ ์ฌ๊ธฐ์ ์ ์ฅ๋ฉ๋๋ค.
์คํ ์ธ๊ทธ๋จผํธ์ ๊ถํ
- ์ฝ๊ธฐ ๊ถํ, ์ฐ๊ธฐ ๊ถํ : CPU๊ฐ ์์ ๋กญ๊ฒ ๊ฐ์ ์ฝ๊ณ ์ธ ์ ์๋๋ก
์คํ ์ธ๊ทธ๋จผํธ์ ํน์ง
- ์คํ ์ธ๊ทธ๋จผํธ์ ๋จ์ ์คํ ํ๋ ์(Stack Frame)
- ํจ์๊ฐ ํธ์ถ ์ ์์ฑ, ๋ฐํ ์ ํด์
ํ๋ก์ธ์ค๊ฐ ์ผ๋ง๋งํผ์ ์คํ ํ๋ ์์ ์ฌ์ฉํ ์ง๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ๊ทธ๋์ ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค๋ฅผ ์์ํ ๋ ์์ ํฌ๊ธฐ์ ์คํ ์ธ๊ทธ๋จผํธ๋ฅผ ๋จผ์ ํ ๋นํด์ฃผ๊ณ , ๋ถ์กฑํด์ง ๋๋ง๋ค ์ด๋ฅผ ํ์ฅํด ์ค๋๋ค. ์คํ์ ๋ํด์ ‘์๋๋ก ์๋๋ค'๋ผ๋ ํํ์ ์ข ์ข ์ฌ์ฉํ๋๋ฐ, ์ด๋ ์คํ์ด ํ์ฅ๋ ๋, ๊ธฐ์กด ์ฃผ์๋ณด๋ค ๋ฎ์ ์ฃผ์๋ก ํ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์
์๋์ ์ฝ๋์์๋ ์ง์ญ๋ณ์ choice๊ฐ ์คํ์ ์ ์ฅ๋ฉ๋๋ค.
void func() {
int choice = 0;
scanf("%d", &choice);
if (choice)
call_true();
else
call_false();
return 0;
}
2.6. ํ ์ธ๊ทธ๋จผํธ
- ํ ์ธ๊ทธ๋จผํธ(Heap Segment) :ํ ๋ฐ์ดํฐ๊ฐ ์์นํ๋ ์์ญ
- C์ธ์ด์์ malloc(), calloc() ๋ฑ์ ํธ์ถํด์ ํ ๋น๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ
ํ ์ธ๊ทธ๋จผํธ์ ๊ถํ
- ์ฝ๊ธฐ ๊ถํ, ์ฐ๊ธฐ ๊ถํ
ํ ์ธ๊ทธ๋จผํธ์ ํน์ง
์คํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ ์ค์ ๋์ ์ผ๋ก ํ ๋น๋ ์ ์์ผ๋ฉฐ, ๋ฆฌ๋ ์ค์์๋ ์คํ ์ธ๊ทธ๋จผํธ์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์๋๋๋ค.
์์
heap_data_ptr์ malloc()์ผ๋ก ๋์ ํ ๋นํ ์์ญ์ ์ฃผ์๋ฅผ ๋์ ํ๊ณ , ์ด ์์ญ์ ๊ฐ์ ์ด๋ค. heap_data_ptr์ ์ง์ญ๋ณ์์ด๋ฏ๋ก ์คํ์ ์์นํ๋ฉฐ, malloc์ผ๋ก ํ ๋น๋ฐ์ ํ ์ธ๊ทธ๋จผํธ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
int main() {
int *heap_data_ptr =
malloc(sizeof(*heap_data_ptr)); // ๋์ ํ ๋นํ ํ ์์ญ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํด
*heap_data_ptr = 31337; // ํ ์์ญ์ ๊ฐ์ ์
printf("%d\n", *heap_data_ptr); // ํ ์์ญ์ ๊ฐ์ ์ฌ์ฉํจ
return 0;
}
๐ก ํ๊ณผ ์คํ ์ธ๊ทธ๋จผํธ๊ฐ ์๋ผ๋ ๋ฐฉํฅ์ด ๋ฐ๋์ธ ์ด์ ?
๋ ์ธ๊ทธ๋จผํธ๊ฐ ๋์ผํ ๋ฐฉํฅ์ผ๋ก ์๋ผ๋ฉฐ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๊ฐ๊ฐ ํ ๋น๋๋ค๋ฉด, ๊ธฐ์กด์ ํ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๊ณ ๋์ ์ด๋ฅผ ํ์ฅํ๋ ๊ณผ์ ์์ ์คํ ์ธ๊ทธ๋จผํธ์ ์ถฉ๋ํ๊ฒ ๋ฉ๋๋ค.

3. ์์ฝ
| ์ธ๊ทธ๋จผํธ | ์ญํ | ์ผ๋ฐ์ ์ธ ๊ถํ | ์ฌ์ฉ ์ |
| ์ฝ๋ ์ธ๊ทธ๋จผํธ | ์คํ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ์ ์ฅ๋ ์์ญ | ์ฝ๊ธฐ, ์คํ | main() ๋ฑ์ ํจ์ ์ฝ๋ |
| ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ | ์ด๊ธฐํ๋ ์ ์ญ ๋ณ์ ๋๋ ์์๊ฐ ์์นํ๋ ์์ญ | ์ฝ๊ธฐ์ ์ฐ๊ธฐ ๋๋ ์ฝ๊ธฐ ์ ์ฉ | ์ด๊ธฐํ๋ ์ ์ญ ๋ณ์, ์ ์ญ ์์ |
| BSS ์ธ๊ทธ๋จผํธ | ์ด๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๊ฐ ์์นํ๋ ์์ญ | ์ฝ๊ธฐ, ์ฐ๊ธฐ | ์ด๊ธฐํ๋์ง ์์ ์ ์ญ ๋ณ์ |
| ์คํ ์ธ๊ทธ๋จผํธ | ์์ ๋ณ์๊ฐ ์ ์ฅ๋๋ ์์ญ | ์ฝ๊ธฐ, ์ฐ๊ธฐ | ์ง์ญ ๋ณ์, ํจ์์ ์ธ์ ๋ฑ |
| ํ ์ธ๊ทธ๋จผํธ | ์คํ์ค์ ๋์ ์ผ๋ก ์ฌ์ฉ๋๋ ์์ญ | ์ฝ๊ธฐ, ์ฐ๊ธฐ | malloc(), calloc() ๋ฑ์ผ๋ก ํ ๋น ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ |
4. ์์
#include <stdlib.h>
int a = 0xa;
const char b[] = "d_str";
int c;
int foo(int arg) {
int d = 0xd;
return 0;
}
int main()
{
int *e = malloc(sizeof(*e));
return 0;
}
malloc() ํจ์๋ก ๋์ ํ ๋น๋์์ผ๋ก ํ ์ธ๊ทธ๋จผํธ์ด๋ค.
2. a, b๊ฐ ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
์ด๊ธฐํ๋ ์ ์ญ๋ณ์์ด๋ฏ๋ก ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์์นํ๋ค.
3. "d_str"์ด ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
๋ฌธ์์ด "d_str"์ ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ(rodata) ์ธ๊ทธ๋จผํธ์ ์ ์ฅ๋๋ค.
4. foo๊ฐ ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
ํจ์ ์ฝ๋๋ ์ฝ๋ ์ธ๊ทธ๋จผํธ์ ์์นํ๋ค.
5. d๊ฐ ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
์ง์ญ๋ณ์์ด๋ฏ๋ก ์คํ์ ์์นํ๋ค.
6. c๊ฐ ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
์ด๊ธฐํ ๋์ง ์์ ์ ์ญ๋ณ์์ด๋ฏ๋ก BSS ์ธ๊ทธ๋จผํธ์ ์์นํ๋ค.
'๐ ๋ณด์ยท์ทจ์ฝ์ > ๐ธ์์คํ ยท์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| File Descriptor (0) | 2022.08.12 |
|---|---|
| [ubuntu] pwntools ์ฌ์ฉ ์ค์ต (0) | 2022.08.11 |
| quiz ํ์ผ ํ์ด (0) | 2022.08.11 |
| [dreamhack] Tool: gdb (0) | 2022.07.28 |
| [dreamhack] x86 assembly (0) | 2022.07.09 |