728x90
리눅스 프로세스의 메모리 구조
(1) 세그먼트
: 리눅스에서는 프로세스의 메모리를 크게 5가지의 세그먼트로 구분한다.
(** 세그먼트 : 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것)
세그먼트의 장점)
- 운영체제가 메모리를 용도별로 나누면, 각 용도에 맞게 적절한 권한을 부여할 수 있다
- 권한은 읽기, 쓰기, 그리고 실행이 존재하며, CPU는 메모리에 대해 권한이 부여된 행위만 할 수 있다
1. 코드 세그먼트
- 실행 가능한 기계 코드가 위치하는 영역으로 텍스트 세그먼트라고도 불림
- 프로그램이 동작하려면 코드를 실행할 수 있어야 하므로 이 세그먼트에는 읽기 권한과 실행 권한이 부여됨
- 반면 쓰기 권한이 있으면 공격자가 악의적인 코드를 삽입하기가 쉬워지므로, 대부분의 현대 운영체제는 이 세그먼트에 쓰기 권한을 제거함
2. 데이터 세그먼트
- 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치
- CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로, 읽기 권한이 부여됨
- data 세그먼트 : 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치한 세그먼트
- rodata (read-only 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
3. BSS 세그먼트
- 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역
- 프로그램이 시작될 때, 모두 0으로 값이 초기화됨
- C 코드를 작성할 때, 초기화되지 않은 전역 변수의 값은 0이 됨
4. 스택 세그먼트
- 프로세스의 스택이 위치하는 영역
- 스택 세그먼트는 스택 프레임(Stack Frame) 이라는 단위로 사용됨
- 스택 프레임은 함수가 호출될 때 생성되고, 반환될 때 해제됨
▶ 스택은 확장 시, 기존 주소보다 낮은 주소로 확장되기 때문에 '아래로 자란다'라는 표현을 종종 사용함.
5. 힙 세그먼트
- 힙 데이터가 위치하는 세그먼트
- 실행중에 동적으로 할당될 수 있으며, 리눅스에서는 스택 세그먼트와 반대 방향으로 자람
- C언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치하게 되며, 일반적으로 읽기와 쓰기 권한이 부여됨
728x90
'Security > System Hacking' 카테고리의 다른 글
[Tool] gdb (0) | 2024.09.09 |
---|---|
[Dreamhack] ssp_001 (0) | 2024.09.01 |
[Dreamhack] ssp_000 write-up (2) | 2024.09.01 |
[Background] x86 Assembly (0) | 2024.09.01 |
[Background] Computer Architecture (1) | 2024.09.01 |