Memory Layout(메모리 레이아웃)이란 프로세스 Virtual Memory(가상 메모리)의 구성을 말한다
- 프로그램을 실행하면 OS는 프로세스에서 사용 가능한 메모리 공간을 할당함
- 이 공간을 가상 메모리라고 부름
- OS는 프로그램의 정보를 참고해서 프로그램 데이터들이 적절한 영역에 저장되게함.
- 프로세스가 사용할 가상 메모리를 용도별로 나누고, 적절하게 저장함
- 유사한 데이터를 모아서 저장하기 때문에 운영체제는 각 구획에 적절한 권한을 부여할 수 있음
프로세스 메모리 구조
섹션
윈도우의 실행파일인 PE 파일은 PE 헤더/ 1개 이상의 섹션으로 구성되어있음
섹션 = 유사한 용도로 사용되는 데이터가 모여있는 영역
섹션에 대한 정보는 PE 헤더에 적혀있음
- 섹션의 이름
- 섹션의 크기
- 섹션이 로드될 주소의 오프셋
- 섹션의 속성과 권한
윈도우는 PE를 실행할 때, PE 헤더에 들어있는 정보를 참조하여 PE의 각 섹션들을 가상 메모리의 적절한 세그먼트에 매핑함.
.text
실행 가능한 기계 코드가 위치하는 영역
- 프로그램이 동작하려면 코드를 실행할 수 있어야 하므로 이 세그먼트에는 읽기/실행 권한이 부여됨
- 쓰기 권한이 있으면 악성 코드를 삽입하기가 쉬워서 보통 쓰기 권한을 제거함
- 정수 31337을 반환하는 main함수가 컴파일 되면 554889e5b8697a00005dc3라는 기계 코드로 변환되는데, 이 기계 코드가 코드 세그먼트에 위치하게 됨
- 함수 → 기계코드로 변환 → 코드 세그먼트에 저장
.data
컴파일 시점에 값이 정해진 전역 변수들이 위치함
- CPU가 이 섹션의 데이터를 읽고 쓸 수 있어야 하므로, 읽기/쓰기 권한이 부여됨
int data_num = 31337;
char data_rwstr[] = "writable_data"; // data
int main() { ... }
.rdata
컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL 및 외부 함수들의 정보가 저장
- CPU가 이 섹션의 데이터를 읽을 수 있어야 하므로, 읽기 권한이 부여되지만 쓰기 권한은 부여되지 않음
const char data_rostr[] = "readonly_data";
char *str_ptr = "readonly"; // str_ptr은 .data, 문자열은 .rdata
int main() { ... }
str_ptr은 “readonly”라는 문자열을 가리키고 있는데,
str_ptr은 전역 변수로서 .data에 위치하지만,
“readonly”는 상수 문자열로 취급되어 .rdata에 위치함
섹션이 아닌 메모리
윈도우의 가상 메모리 공간에는 섹션만 로드되는 것이 아님
프로그램 실행에 있어서 필요한 스택과 힙 역시 가상 메모리 공간에 적재됨.
스택
윈도우즈 프로세스의 각 스레드는 자신만의 스택 공간을 가지고 있음
보통 지역 변수나 함수의 리턴 주소가 저장됨.
- 읽기/쓰기 권한이 부여됨
- 스택이 확장될 때, 기존 주소보다 낮은 주소로 확장됨.

힙
여러 용도로 사용하기 위해 할당 → 모든 종류의 데이터가 저장될 수 있음
- 스택보다 큰 데이터 저장 가능
- 전역적으로 접근이 가능하도록 설계되었음
- 실행 중 동적으로 할당받음
- 읽기/쓰기 권한 + 상황에 따라 실행 권한

'Reversing > Dreamhack : Reverse Engineering' 카테고리의 다른 글
| Quiz: x86 Assembly 1 (0) | 2025.04.16 |
|---|---|
| x86 Assembly🤖: Essential Part (0) | 2025.04.16 |
| Background: Computer Architecture (0) | 2025.04.16 |
| Background: Static Analysis vs. Dynamic Analysis (0) | 2025.04.16 |
| Background : Binary (0) | 2025.04.16 |