#define IMAGE_SIZEOF_SHORT_NAME 8
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;
IMAGE_SECTION_HEADER 구조체의 크기는 40bytes 로 이 구조체 배열의
실제 엔트리 수는 IMAGE_FILE_HEADER 의 NumberOfSections 필드에 지정되어있다.
Name[IMAGE_SIZEOF_SHORT_NAME]
섹션의 ASCII 이름을 나타내는것으로 IMAGE_SIZEOF_SHORT_NAME 은 8bytes 까지 이며 NULL 은 제외된다.
만약 섹션명이 8bytes 이상으로 지정될 경우 링커는 8bytes 이후의 문자열을 잘라낸후 이 필드에 값을 지정한다.
Mics
- PhysicalAddress : OBJ 파일에서만 사용되며 0으로 설정되고, 섹션을 물리적인 번지를 담고있다.
- VirtualSize : 메모리에 로드될 때 섹션의 바이트 크기를 의미한다.
VirtualAddress
PE 가 로드될때 해당 섹션이 매핑될 시작 번지에 대한 RVA 를 담고있다.
매핑될 가상주소는 IMAGE_OPTIONAL_HEADER 의 ImageBase 값에 VirtualAddress 의 값을 더한 값이되고,
IMAGE_OPTIONAL_HEADER 의 SectionAlignment 값의 배수가 되어야한다.
SizeOfRawData
디스크상의 PE 파일에서 해당 섹션이 차지하는 크기를 의미하며, 만약 해당 섹션이 초기화 되지않았거나Characteristics 필드에 IMAGE_SCN_CNT_UNINITIALIZED_DATA 속성이 설정되있으면 0을 가지게된다.
PointerToRawData
디스크상의 PE 파일에서 해당 섹션이 시작되는 실제 파일 오프셋을 의미하며,
RVA 와 파일 오프셋 사이의 변환에서 핵심적인 역할을 한다.
IMAGE_OPTIONAL_HEADER 의 FileAlignment 값의 배수여야하며, 초기화 되지않은 데이터를 가지면 0으로 설정된다.
PointerToRelocations , NumberOfRelocations
이 두 필드는 OBJ 파일에서만 사용되며 PE 에서는 항상 0을 가진다.
PointerToLinenumbers , NumberOfLinenumbers
- PointerToLinenumbers : IMAGE_LINENUMBER 구조체 배열의 시작을 의미하는 파일 오프셋이다.
- NumberOfLinenumbers : IMAGE_LINENUMBER 구조체 배열의 원소 개수를 의미한다.
이 필드들은 COFF 줄번호가 PE 에 첨부되었을 경우에만 사용된다.
Characteristics
섹션의 속성(권한)을 나타내는 플래그들로, WinNT.h 에 IMAGE_SCN_XX_XX 형태로 #define 문에 정의되어있다.
각 플래그에대한 정보는 MSDN 에서 찾아볼 수 있다.
'보안 > Reversing' 카테고리의 다른 글
Injection 기법 (0) | 2020.09.04 |
---|---|
PE 파일 구조 - IMAGE_OPTIONAL_HEADER (0) | 2020.07.23 |
PE 파일 구조 - IMAGE_FILE_HEADER (0) | 2020.07.23 |
PE 파일 구조 - IMAGE_NT_HEADERS (0) | 2020.07.23 |
PE 파일 구조 - IMAGE_DOS_HEADER (0) | 2020.07.22 |