본문 바로가기

[+] Information/[-] RCE

PE 구조 (8)

이번에는 이전 글에서 다루지 못한 .rsrc 섹션에 대해서 알아보도록 하겠다.

[.rsrc 섹션]
이 섹션은 GUI 프로그램에서 많이 볼 수 있는 섹션으로 그래픽 정보를 저장하는 섹션이다.
해당 섹션의 구조는 다른 섹션과는 달리 트리구조로 되어 있으며 이 트리를 구성하는데 있어 각 노드들에는 두가지의 구조체가 있다. IMAGE_RESOURCE_DIRECTORY라는 구조체와 IMAGE_RESOURCE_DIRECTORY_ENTRY 구조체이다.
또 섹션의 트리에는 속하지 않지만 실제 리소스들의 대한 정보를 가지고 있는 IMAGE_RESOURCE_DATA_ENTRY
구조체가 있다.
해당 섹션의 속성정보를 알아본 뒤 각 구조체에 대해서 알아보도록 하겠다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_MEM_READ

[IMAGE_RESOURCE_DIRECTORY]
해당 구조체는 해당 노드에 대한 정보를 가지고 있는 구조체로, 아래와 같은 형태이다.

[그림 1 - IMAGE_RESOURCE_DIRECTORY 구조체 형태]

 - Characteristics : 속성정보를 나타내지만 현재는 예약 영역으로 쓰이고 있어 항상 0으로 설정되어 있다.
                            크기는 4바이트 이다.

 - TimeDateStamp : 섹션이 컴파일된 날짜와 시간을 의미한다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
                             크기는 4바이트 이다.

 - MajorVersion : 리소스의 주버전을 나타낸다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
                         크기는 2바이트 이다.

 - MinorVersion : 리소스의 하위버전을 나타낸다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
                         크기는 2바이트 이다.

 - NumberOfNameEntries : 해당 노드 다음에 나오는 노드들 중 이름으로 자신을 구별하는 노드들의 개수를
                                       가지고 있다. 크기는 2바이트 이다.

 - NumberOfIdEntries : 해당 노드 다음에 나오는 노드들 아이디로 자신을 구별하는 노드들의 개수를 가지고 있다.
                                 크기는 2바이트 이다.

결국 이 구조체에서는 마지막 2개의 구조체 멤버만 쓰인다. 


[IMAGE_RESOURCE_DIRECTORY_ENTRY]
해당 구조체는 다른 노드나 하위 노드들의 정보와 실제 리소스 데이터를 가지고 있는 구조체이다.
구조체의 형태는 아래와 같다.

[그림 2 - IMAGE_RESOURCE_DIRECTORY_ENTRY 구조체 형태]


 - Name : 만약 엔트리가 이름으로 구별되어질 경우 사용하는 멤버이다. 최상위 1비트가 1로 설정되어 있으며,
               나머지 31비트는 실제 이름스트링을 가리키는 오프셋(RVA)이다. 크기는 4바이트 이다.
* 참고 : 오프셋 위치는 IMAGE_RESOURCE_DIRECTORY부터 시작이다.
 

 - Id : 만약 엔트리가 아이디로 구별되어질 경우 사용하는 멤버이다. 최상위 1비트가 0으로 설정되어 있으며, 하위
         16비트가 정수로 Id를 뜻한다. 크기는 4바이트 이다.

 - OffsetToData : 만약 엔트리가 아이디를 사용하면, 최상위 1비트는 0으로 설정되며, 나머지는 실제 리소스의
                        오프셋이 된다. 만약 또 다른 엔트리를 가리킬 경우, 최상위 1비트는 1로 설정되며, 나머지는
                        오프셋이 되어 또 다른 엔트리를 가리킨다. 크기는 4바이트 이다.


[IMAGE_DIRECTORY_DATA_ENTRY]
해당 구조체는 실제 리소스들이 저장된 위치와 크기, 코드 페이지 등에 대한 정보를 가지고 있다.
아래는 해당 구조체의 형태이다.

[그림 3 - IMAGE_DIRECTORY_DATA_ENTRY 구조체 형태]

 - OffsetToData : 실제 리소스 데이터가 위치해 있는 주소의 RVA값을 가지고 있다. 크기는 4바이트 이다.

 - Size : 리소스 데이터의 크기이며, 단위는 바이트이다. 크기는 4바이트 이다.

 - CodePage : 리소스 데이터의 코드 페이지 값이다. 보통은 유니코드를 사용하며 값은 0으로 설정되어 있다.
                     크기는 4바이트 이다.

 - Reserved : 예약 영역이며, 0으로 채워져 있다. 크기는 4바이트 이다.


이제 각 구조체가 어떻게 트리형태로 구성되는지 알아볼 차례이다.

아래는 각 구조체와 노드가 어떤 형태로 트리구조를 형성하고 있는지 도식화 한 것이다.

[그림 4 - .rsrc 트리구조]


맨 위 루트노드는 각 하위 노드들을 찾는데에만 사용이 되며, 루트 하위 노드들은 각 리소스 타입을 대표하는 노드들로 사용이 된다. IMAGE_RESOURCE_DIRECTORY_ENTRY의 개수에 따라 해당 노드는 NumberOf[Name/ID]Entries의 값이 결정된다.
예를들면 루트 하위 노드들이 이름으로 구분지어 지면 루트노드의 NumberOfNameEntries의 값은 3이 되는 것이다.
* 참고:  .rsrc의 트리구조가 모두 위 이미지처럼 IMAGE_RESOURCE_DIRECTORY_ENTRY의 개수가
          일정한 것은 아니다.



 


'[+] Information > [-] RCE' 카테고리의 다른 글

ARE(Android Reverse Engineering) 환경 소개  (5) 2012.05.05
Oter : Android Revese Engineering Tool  (8) 2012.01.30
PE 구조 (7)  (0) 2012.01.01
PE 구조 (6)  (0) 2011.12.31