본문 바로가기

[+] Information/[-] RCE

PE 구조 (7)

이번에는 실행파일에서의 핵심구조인 섹션을 알아 볼 차례이다.

앞에서 알아본 PE 구조들은 실행파일들의 정보나 메모리에 로드될 때의 정보 등이었지만 지금 알아 볼 섹션은 실행파일의

동작에 관한 정보들이다. 

섹션에는 여러가지 섹션이 있는데, 대부분 .text, .data, .rdata, .rsrc, .edata, .idata, .reloc 섹션이 많이 사용된다.

각 섹션이 의미하는 바는 각 섹션을 분석할 때 설명할 것이다.

분석하고자 하는 파일의 섹션정보는 PE File Header를 보면 NumberOfSections에 섹션 개수가 나타나 있으며, 각 섹션의

위치 정보 등은 Section Header 영역에 보면 나와 있다.

아래는 notepad.exe 섹션정보를 Hex Viewer 등으로 본 이미지이다.

[그림 1 - NumberOfSections]

[그림 2 - 섹션헤더 영역의 섹션 이름]
 
notepad.exe에는 총 4가지의 섹션이 있으며, 섹션의 종류는 .text, .data, .rsrc, .reloc 이 있다.

이제부터 하나씩 상세히 알아보도록 하겠다.

[.text 섹션]
.text 섹션은 실행파일의 소스코드가 들어있는 섹션으로, 초기화되거나 초기화 되지 않은 변수, import와 export 테이블
정보를 제외한 나머지 소스코드들이 저장되어 있다. 해당 섹션의 기본 속성정보로는 아래와 같다.
 - IMAGE_SCN_CNT_CODE
 - IMAGE_SCN_MEM_EXCUTE
 - IMAGE_SCN_MEM_READ

섹션의 위치와 크기는 섹션헤더(PointerToRawData, SizeOfRawData)를 참고하면 알 수 있으며 아래는 .text 섹션
헤더에서의 PE 파일 내에서의 .text 섹션 위치와 크기를 알아 본 것이다.

* 참고 : 메모리상에서의 주소와 크기는 VirtualAddress, VirtualSize를 참조하면 된다.

[그림 3 - .text 섹션의 오프셋과 크기]


위 정보를 보면 PE 파일내에서의 주소는 주소는 "0x00000400", 크기는"0x0000A800" 이다.
.text 섹션의 마지막 오프셋은 주소와 크기를 더하게 되면 나오고 결과값은 "0x0000AC00" 가 된다.
이 정보를 토대로 가보면 아래와 같다. 

[그림 4 - .text 섹션의 모습]

섹션의 모습을 보면 어느정도 데이터가 있다가 나머지는 0으로 채워져 있다. 이러한 이유는 SizeOfRawData의 경우 FileAlignment(IMAGE_OPTIONAL_HEADER)의 배수가 되어야 하므로 실제 데이터의 크기를 가지고 있는 VirtualSize의 값을 FIleAlignment의 값의 배수로 올림하여 크기가 늘어나 채울 데이터가 없어 0으로 채운것이다.
실제 메모리에 .text 섹션이 올라갈때는 0을 제외하고 올라가게 된다. 


이러한 방법으로 모든 섹션의 영역을 찾을 수 있다.

이 방법을 계속 섹션마다 사용하여 영역을 찾는 것을 보여 줄 수는 없기 때문에 이후에 나오는 섹션들은 특징과 속성정보등만

소개하겠다.

[.data 섹션]
.data 섹션은 읽기/쓰기가 가능한 일반적인 데이터를 위한 섹션으로, 정적변수와 전역변수가 저장된다. 
해당 섹션의 기본 속성정보는 아래와 같다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_MEM_READ
 - IMAGE_SCN_MEM_WRITE 


[.rdata]
.rdata 섹션은 읽기전용 섹션으로 상수와 배열로 직접 정의된 문자열과 런타임 라이브러리에서 사용하는 에러 메시지 등이 저장된다. 가끔 debug섹션이나 DLL import 섹션이 크기가작고 읽기전용 속성을 가지면 .rdata 섹션으로 통합되는 경우가 있는데 이러한 현상이 일어나는 이유는 아직 밝혀지지 않았다. 
해당 섹션의 기본 속성정보는 아래와 같다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_MEM_READ 


[.idata, .edata 섹션]
.idata 섹션은 import table이 들어있으며, .edata 섹션은 export table이 의미한다. 이 섹션들은 실행하는데 꼭
필요한 섹션은 아니다.
.idata 섹션의 기본 속성정보는 아래와 같다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_MEM_READ
 - IMAGE_SCN_MEM_WRITE

.edata 섹션으 기본 속성정보는 아래와 같다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_MEM_READ 


[.reloc 섹션]
해당 섹션은 PE 파일이 메모리상에 로드 될 때 재배치에 관해 참조하는 정보가 들어있는 섹션이다.
실행파일의 경우 이 섹션은 필요하지 않을 수 있지만, DLL 파일의 경우 메모리에 로드 될때 재배치를 염두하고 있기 때문에 이 섹션이 없으면 실행이 되지 않을 수도 있다.
 - IMAGE_SCN_MEM_READ
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_TYPE_NOLOAD 


마지막으로 남은 .rsrc 섹션은 트리구조로 되어 있어 조금 내용이 많아 다음글에서 다루도록 하겠다.
 

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

Oter : Android Revese Engineering Tool  (8) 2012.01.30
PE 구조 (8)  (0) 2012.01.01
PE 구조 (6)  (0) 2011.12.31
PE 구조 (5)  (0) 2011.12.31