윈도우의 PE 파일은 PE 헤더와 1개 이상의 섹션으로 구성되어 있습니다. 여기서 섹션이란, 유사한 용도로 사용되는 데이터가 모여있는 영역입니다.
셋견에 대한 정보는 PE 헤더에 적혀있습니다. PE 헤더에 저장되는 섹션과 관련된 데이터 중, 중요한 것은 다음과 같습니다.
윈도우는 PE를 실행할 때 이 정보를 참조하여 PE의 각 섹션들을 가상 메모리의 적절한 세그먼트에 매핑합니다. 일반적으로 .text, .data, .rdata 섹션이 사용됩니다.
.text 섹션은 실행 가능한 기계 코드가 위치하는 영역입니다.
프로그램이 동작하기 위해선 코드를 실행할 수 있어야 하므로 이 세그먼트에는 읽기 권한과 실행 권한이 부여됩니다. 반면 쓰기 권한이 있으면 공격자가 악의적인 코드를 삽입하기 쉬워지므로 대부분의 현대 운영체제는 이 세그먼트에 쓰기 권한을 제거합니다.
.data 섹션에는 컴파일 시점에 값이 정해진 전역 변수들이 위치합니다. CPU가 이 섹션의 데이터를 읽고 쓸 수 있어야 하므로 읽기 권한과 쓰기 권한이 부여됩니다.
.rdata 섹션에는 컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL 및 외부 함수들의 정보가 저장됩니다. CPU가 이 데이터를 읽을 수 있어야 하므로 읽기 권한이 주어지지만, 쓰기 권한은 주어지지 않습니다.
윈도우의 가상 메모리 공간에는 섹션만 로드되는 것이 아닙니다. 프로그램 실행에 필요한 스택과 힙 역시 가상 메모리 공간에 적재됩니다.
윈도우즈 프로세서의 각 쓰레드는 자신만의 스택 공간을 가지고 있습니다. 스택에는 보통 지역 변수나 함수의 리턴 주소가 저장됩니다. 이 영역은 자유롭게 읽고 쓸 수 있어야 하기에 읽기/쓰기 권한이 부여됩니다.
힙은 프로그램이 여러 용도로 사용하기 위해 할당받는 공간입니다. 따라서 모든 종류의 데이터가 저장될 수 있습니다. 스택과 다른 점은 비교적 스택보다 큰 데이터도 저장할 수 있고 전역적으로 접근이 가능하도록 설계되었단 점입니다.