반응형
각 Section의 속성을 정의한 것이 Section Header이다.
PE 파일을 여러개의 Section 구조로 만들었을 때 장점은 바로 프로그램의 안정성이다.
Code와 data가 하나의 섹션으로 되어있고 섞여있다면 복잡함을 무시하고라도 안정성에 문제가 생길 수 있다.
예) data에 값을 쓰다가 overflow가 발생했을 때, 다음의 명령어를 그대로 덮어 써버리므로 프로그램은 뻗는다.
이런 이유 때문에 섹션마다 권한이 다 다르다.
종류 | 엑세스 권한 |
code (.text) | 실행, 읽기 권한 |
data (.data) | 비실행, 읽기, 쓰기 권한 |
resourse (.rsrc) | 비실행, 읽기 권한 |
그래서 각각의 Section 속성이 Section header에 저장되어 있다.
Section 의 속성에는 file/memory 에서의 시작위치, 크기, 엑세스 권한 등이 있다.
- IMAGE_SECTION_HEADER
Section header 는 각 Section 별 IMAGE_SECTION_HEADER 구조체의 배열로 되어있다.
#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 구조체에서 알아야 할 중요 멤버는 아래와 같다.
- Name : 아래에서 설명.
- VirtualSize : 메모리에서 섹션이 차지하는 크기
- VirtualAddress : 메모리에서 섹션의 시작 주소 (RVA)
- SizeOfRawData : 파일에서 섹션이 차지하는 크기
- PointerToRawData : 파일에서 섹션의 시작 위치
- Characteristics : 섹션의 특징 bit OR
(이것들을 제외한 나머지는 쓰지 않는다.)
- VirtualAddress 와 PointerToRawData 의 값은 아무 값이나 가질 수 없고,
각각 (IMAGE_OPTIONAL_HEADER32 or 64 에 정의된) SectionAlignment 와 FileAlignment 에 맞게 결정된다. - VirtualSize 와 SizeOfRawData 는 서로 틀린값을 가집니다.
즉, 파일에서의 섹션 크기와 메모리에 로딩된 섹션의 크기는 다르다. - Characteristics 는 아래에 속성대로 bit or 연산한 값이 들어가있게 된다. winnt.h에 정의되어 있다.
#define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code.
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data.
#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.
Section header의 Name은 명시적인 규칙이 없기 때문에 어떠한 값을 넣어도 된다.
섹션의 Name은 참고용일 뿐 100% 이거라고 장담할 수 없다.
예) 데이터 섹션의 이름을 .code로 사용해도 된다.
아래 이미지는 HxD로 notepad를 열어 간단하게 .text섹션의 header만 구분한 모습이다.
- Name : 2E74657874
- VirtualSize : 0000A7A0
- VirtualAddress : 00001000
- SizeOfRawData : 0000A800
- PointerToRawData : 00000600
- Characteristics : 60000020
다음에는 RVA to RAW 하겠습니다.
반응형
'윈도우 > PE 구조' 카테고리의 다른 글
PE 구조 (6) - IAT (0) | 2022.04.19 |
---|---|
PE 구조 (5) - (RVA to RAW) 예제 포함 (0) | 2022.04.05 |
PE 구조 (3) - (NT Header) (0) | 2022.03.31 |
PE구조 (2) - (DOS Header, DOS Stub) (0) | 2022.03.30 |
PE 구조 (1) - (PE File Format, VA & RVA) (0) | 2022.03.29 |
최근댓글