메모리 레이아웃(Memory Layout) 이란, 가상 메모리(Virtual Memory) 의 구성을 말한다. 가상 메모리란, 운영체제가 프로세스에게 할당해주는 사용 가능한 메모리 공간이다.
운영체제는 더 나아가 매모리를 적절하게 구획하고 권한을 부여한다.
섹션이란 유사한 용도로 사용되는 데이터가 모여있는 영역이다. 윈도우 PE파일은 PE헤더와 1개 이상의 섹션으로 구성되어 있다. PE 헤더에는 섹션에 대한 정보가 담겨있다. 다음은 그 중 몇을 추린 것이다.
- 섹션의 이름
- 섹션의 크기
- 섹션이 로드될 주소의 오프셋
- 섹션의 속성과 권한
윈도우는 PE를 실행하면서 이 정보들을 참조하고 PE의 각 세션을 적절한 세그먼트에 매핑한다.(필수 섹션은 정해지지 않는다)
.text 섹션은 실행 가능한 기계 코드가 위치하는 영역이다. 운영체제는 보안을 위해 이 세그먼트에 쓰기권한을 제거한다.
.data 섹션에는 컴파일 시점에 값이 정해진 전역 변수들이 위치한다. 당연히 읽고 쓰기가 가능해야 하므로 읽기/쓰기 권한이 부여된다.
.rdata 섹션에는 컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL(동적 링크 라이브러리:여러 프로그램에서 동시에 사용할 수 있는 코드와 데이터를 포함하는 동적 라이브러리) 및 외부 함수들의 정보가 저장된다. 여기에는 읽기 권한 만이 부여된다.
스택과 힙 또한 가상 메모리에 적재된다.
스택
윈도우즈 프로세스의 각 쓰레드는 자신만의 스택 공간을 가지고 있다. 지역변수, 함수의 리턴 주소가 저장되며 읽기/쓰기 권한이 부여된다. 스택이 확장 될 때에는 낮은 주소로 확장된다.
힙
힙은 프로그램이 여러 용도로 사용하기 위해 할당받는 공간이다. 따라서 모든 종류의 데이터가 저장될 수 있다.(짬통인가?) 스택과 달리, 큰 데이터도 저장 가능하고, 전역 접근이 되며, 실행 중 동적으로 할당 받는다. 상황에 따라 실행 권한도 부여 받는다.