반응형

각 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 구조체에서 알아야 할 중요 멤버는 아래와 같다.

 

  1. Name : 아래에서 설명.
  2. VirtualSize : 메모리에서 섹션이 차지하는 크기
  3. VirtualAddress : 메모리에서 섹션의 시작 주소 (RVA)
  4. SizeOfRawData : 파일에서 섹션이 차지하는 크기
  5. PointerToRawData : 파일에서 섹션의 시작 위치
  6. 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만 구분한 모습이다.

  1. Name : 2E74657874
  2. VirtualSize : 0000A7A0
  3. VirtualAddress : 00001000
  4. SizeOfRawData : 0000A800
  5. PointerToRawData : 00000600
  6. 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