본문 바로가기

리버스 엔지니어링

섹션 헤더

각 섹션의 속성을 정의한 것이 섹션헤더이다. 섹션헤더 구조체를 보기 전에 한번 생각해보자. 앞서 PE파일은 code,data resource등을 각각의 섹션으로 나눠서 저장한다했다. 그렇다면 PE File Format을 설계한 사람들은 어떤 장점이 있기 때문에 그랬을 것이다.


PE 파일을 여러 개의 섹션 구조로 만들었을 때 장점은 프로그램의 안정성이다. code와 data가 하나의 섹션으로 되어있고 서로 뒤죽박죽 섞여있다면 복잡함은 둘째치더라고 해도 안정성에 문제가 생길수 있다.

가령 문자열 data에 값을 쓰다가 어떤 이유로 overflow가 발생가 발생했을때 바로 다음 code를 그대로 덮어써버릴 것이므로 프로그램에 큰 손상이 생긴다. 그래서 PE FILE Format 설계자들은 비슷한 자료를 섹션이라고 이름 붙인곳에 모아두기로 결정하였고 각각의 섹션의 속성을 기술할 섹션 헤더가 필요로 하게 된 것이다.


즉 code/data/resource마다 각각의 특성, 접근 권한 등을 다르게 설정할 필요가 있다.


종류 

액세스 권한 

code 

실행, 읽기 권한 

data 

비실행, 읽기,쓰기권한 

resource 

비실행,읽기 권한 



IMAGE_SECTION_HEADER

섹션 헤더는 각 섹션별 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 구조체에서 알아야 할 중요 맴버는 아래와 같다.(나머지는 않쓰    임)


 항목

 의미

 VirtualSize 

 메모리에서 섹션이 차지하는 크기 

 VirtualAddress 

 메모리에서 섹션의 시작 주소(RVA) 

 SizeOfRawData

 파일에서 섹션이 차지하는 크기 

 PointerToRawData

 파일에서 섹션의 시작 위치 

 Characterisstics

 색션의 속성(bit OR) 



VirtualAddress 와 PointerToRawData 의 값은 아무 값이나 가질 수 없고, 각각 (IMAGE_OPTIONAL_HEADER32 에 정의된) SectionAlignment 와 FileAlignment 에 맞게 결정된다.


VirtualSize와 SizeOfRawData는 일반적으로 서로 다른 값을 가진다. 즉 파일에서의 섹션 크기와 메모리에 로딩 된 섹션의 크기는 다르다는 얘기.





----------------------------------------------------------------------------------------------------------------

PE 파일 설명에서 자주 등장하는 이미지(Image)라는 용어는 PE파일이 메모리에 로딩될 때 파일이 그대로 올라가는 것이 아니라 섹션 헤더에 정의된 대로 섹션 시작주소, 섹션 크기 등에 맞춰서 올라간다. 따라서 파일에서의 PE와 메모리에서 PE는 서로 다른 모양을 가진다. 이를 구별하기 위해서 메모리에 로딩된 상태를 이미지라는 용어를 사용해서 구별한다.

'리버스 엔지니어링' 카테고리의 다른 글

IAT란? -1 DLL  (0) 2018.01.18
RVA to RAW  (0) 2018.01.18
NT 헤더 -2  (0) 2018.01.16
PE 헤더 -1  (0) 2018.01.11
PE File Format -1  (0) 2018.01.10