PE 파일의 주요 자료구조 분석 섹션 테이블 실습 CFF Explorer
섹션테이블
- 배열처럼 동일한 자료구조 나열
- 섹션이 n개면 n개의 IMAGE_SECTION_HEADER가 있음
- IMAGE_SECTION_HEADER가 모여서 섹션 테이블의 구조
- 각 섹션의 속성을 확인할 수 있음
- 프로그램 실행 시 로더에서 PE헤더를 통해 섹션을 먼저 파악함
IMAGE_SECTION_HEADER의 구성요소
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
Misc.VirtualSize
메모리에 로드될 때 섹션의 총 크기이고, 값이 SizeOfRawData 멤버보다 크면 섹션이 0으로 채워짐
VirtualAddress
이미지 베이스를 기준으로 메모리에 로드될 때 섹션의 첫 번째 바이트 주소
ex) DWORD VirtualAddress; →1000 // 메모리에 올라간 파일의 시작위치로부터 1000만큼 떨어진 위치에 첫 번째 섹션을 매핑
SizeOfRawData
디스크에서 초기화된 데이터의 크기이고 이 값은 IMAGE_OPTIONAL_HEADER 구조체의 FileAlignment 멤버의 배수여야 함. 이 값이 VirtualSize 멤버보다 작으면 섹션의 나머지 부분은 0으로 채워짐
PointerToRawData
COFF 파일 내의 첫 번째 페이지에 대한 파일 포인터, 이 값은 IMAGE_OPTIONAL_HEADER 구조체의 FileAlignment 멤버의 배수여야 함.
ex) DWORD PointerToRawData; → 400 // 파일의 시작 지점부터 정확히 400만큼 떨어진 위치에 첫 번째 섹션이 존재
Characteristics
read, write, excute 등 프로텍션에 대한 정보
CFF Explorer 섹션 테이블 실습
sample_x32.exe 실행 파일을 CFF Explorer에 로드했다
DOS header, NT Header, Section Header 등 헤더들이 확인된다
COFF 파일 이므로 CFF Explorer 에서 덤프가 가능하고 이전에 보았던 섹션들이 보인다
- .text: 기계어 코드
- .data: 전역변수
- .idata: 임포트 할 api, dll 정보
파일 상에서 위치는 Raw Address
가상 메모리 위치는 Virtual Addres
s.data의 virtual adress→00003000이지만 이는 오프셋 값이므로
실제 위치는 실행파일이 로드된 주소인 00400000+00003000 = 00403000인 것이 확인됨
각 섹션들의 Characteristics(protection) 값 확인
x32 dbg에 로드해도 각 섹션의 프로텍션을 바로 파악할 수 있다!
요약: 섹션 테이블은 로더를 위해 존재한다고 할 수 있는데,
각 섹션들에 대한 정보가 있어서 그에 따라 로더가 매핑을 하기 때문