작업 환경
분류 | 이름 |
Host PC | Windows 7 |
Guest PC | Windows xp sp3 |
Tool -1 | HxD Editor |
Tool -2 | PE-View |
Target | notepad |
PE File Format
: Portable Excutable File Format 로서 Window 계열의 운영체제에서 사용하는 실행파일의 형태를 말합니다.(winnt.h 에 정의)
PE file Format의 전체적인 구조
: <그림 1>과 같은 구조로 실행 파일 내에 있다가 실행하는 순간 약간의 크기만 늘어나면서 Memory에 올라가게 됩니다.
.png)
<그림 1>
각 구조체 별 설명
1. _IMAGE_DOS_HEADER : 총 0x40 Byte로 이루어져 있으며 DOS 파일의 호환성을 위해 만들어 졌으나 현재에는 실제로 사용되는 부분은 e_magic와 e_lfanew 입니다.
<그림 2>
(1) e_masic : 0x5A4D, 즉 "MZ"로 고정되어 있는데 이는 "나 DOS용 실행 파일이야!"라고 알려주기 위해 사용한다고 생각하면 됩니다.
이런 것이 있는 이유는 Windows 에서도 DOS 가 사용되던 시절에 구별을 위해 사용하였습니다.
(2) e_lfanew : NT_Header의 offset 값이 들어 있습니다.
예를 들어 <그림 2>의 e_lfanew는 0x00E0 이므로 _IMAGE_NT_HEADER의 시작 위치는 0x00E0 입니다.
2. DOS Stub : 이는 DOS 때 사용하던 영역으로 현재에는 따로 이용하지 않습니다.
하지만 가끔 특정 악성코드의 경우에는 이 영역에 악성코드를 심는 경우가 있으므로 주의해야합니다.
<그림 3>
3. _IMAGE_NT_HEADER : 140(2) Byte 로 이루어져 있으며 여기부터는 NT 계열에서 사용하는 실행파일이라고 생각하면 됩니다.
<그림 4>
(1) SIGNATURE : PE Header의 시작 부분으로 <그림 4>와 같이 0x00004550으로 고정되어 있습니다.
하지만 초기의 바이러스 들은 중복 감염을 피하기 위해 이곳에 자신만의 표식을 남기는 경우가 많았습니다.
ex) 0x37004550
(2) _IMAGE_FILE_HEADER : 파일을 실행하기 위한 가장 기본적인 데이터가 담겨진 구조체로 14(2) Byte로 이루어져 있습니다.
<그림 5>
- Machine : 현재의 실행 파일이 돌아가는 환경으로 32 bit는 0x014C, 64 bit는 0x0200으로 되어 있습니다. 물론 이 외에도 많은 값이 있지만 대표적으로 사용하는 것이 이 두 가지이기 때문에 이정도만 암기하고 넘어가도록 하겠습니다.
- Number Of Sections : Section의 갯수를 의미하며 notepad.exe의 경우 3개의 Section으로 이루어 졌음을 알 수 있습니다.
보통 Visual Stdio 에서 MFC로 별다른 옵션 변경 없이 빌드한 파일의 경우에는 .text, .rdata, .date, .rsrc 로 4개의 Section이 만들어지게 되며 Number Of Sections의 값은 4가 됩니다.
- Time Date Stamp : 이 파일을 빌드한 날짜, 정확히는 obj 파일이 컴파일러를 통해 EXE를 생성한 시간을 의미하지만 악성코드에 의한 조작 가능성도 있기 때문에 참고 정도만 하는 것이 좋습니다.
- Symbol Table : 현재는 사용되지 않으므로 0으로 채워져 있습니다
- Number Of Symbols : 현재는 사용되지 않으므로 0으로 채워져 있습니다
- Size Of Opeional Header : _IMAGE_OPTIONAL_HEADER의 크기를 의미합니다.
- Characteristics : 실행파일의 특징으로 OR 연산으로 값이 들어가있습니다.
이 것으로 DLL인지 EXE인지도 구별이 가능하며 확장자와 이름은 속일 수 있어도 이러한 특징들은 속이기 힘들기 때문에 중요합니다.
(3) _IMAGE_OPTIONAL_HEADER
<그림 6>
- Magic : 32bit 구조체라면 0x010B, 64bit 구조체라면 0x020B라는 값을 가집니다.
- Major Linker Version + Minor Linker Version : Linker의 version을 의미하며 notepad.exe의 경우 07+0A 하여 0x07.0A 라고 할 수 있습니다.
- Size Of Code : 실제 기계어 코드의 길이를 의미합니다.
- Size Of initialized Data : 파일에 실제로 공간을 잡아야하는 변수의 총 크기를 의미합니다.
- Size Of Uninitialized Data : 실행 파일 자체에 따로 공간을 잡아줄 필요가 없는 변수의 총 크기를 의미합니다.
예제 코드
char test1[100];
char test2[100] = "hello world";
int main(){
-------------------
}
라 했을때 test1은 Uninitialized Data에 속하고 test2가 Initialized Data에 속합니다.
※ 이러한 부분 때문에 File이 실행되어 Memory에 올라갈때 크기가 변경 되어 올라가게 됩니다.
- Address Of Entrypoint : 처음 시작할 코드로서 프로그램에서 최초로 실행되는 코드의 실제 주소를 의미합니다.
단! 이 역시 상대 주소로 되어있기 때문에 주소를 구하기 위해서는 ImageBase에 더해주어야 합니다.
- Base Of Code : Code 영역의 시작 주소
- Base Of Data : Data 영역의 시작 주소
- ImageBase : PE File이 실행될 경우 실제 가상 메모리에 올라가는 번지를 가리킵니다.
예를 들어 EXE 파일의 경우 0x00400000, DLL 파일의 경우 0x10000000 입니다.
- Section Alignment : Memory에서의 Section의 최소 단위
- File Alignment : File 에서의 Section의 최소 단위
- Major OS Version + Minor OS Version : 이 파일을 실행할 수 있는 Windows의 최소 Version
- Major Image Version + Minor Image Version : 실행 파일의 버전으로 잘 사용되지 않습니다.
- Major SubSystem Version + Minor SubSystem Version
- Win 32 Version Value
- Size Of Image : Virtual Memory 상의 Image의 크기
- Size Of Headers : PE Header의 전체 크기를 의미합니다.
- Checksum
- Subsystem : 이 파일이 돌아가는 환경이 Gui인지 Cli인지를 알 수 있습니다.
- DLL Charictoristics
- Size Of Stack Reverse : 예약된 Stack의 크기를 말하는데 보통은 일단 4개를 잡고 시작할 때에는 2개 만을 사용하게 됩니다.
- Size Of Stack Commit
- Size Of Heap Reverse
- Size Of Heap Commit
- Loader Flags
- Number Of Data Directory : DataDirectory 배열의 갯수
- DataDirectory : _IMAGE_DATA_DIRECTORY 구조체 배열로 [0]은 Export Directory를 [1]는 Import Directory를 [2]는 Resource Directory를 의미합니다.
이에 대해서는 IAT나 EAT에 대해 설명할때 자세히 설명하도록 하겠습니다.
4. _IMAGE_SECTION_HEADER : 각 Section 별로 존재하며 해당 Section의 정보가 기록되어 있습니다.
<그림 7>
- Name[IMAGE_SIZEOF_SHORT_NAME] : Section의 이름
- Virtual Size : Memory에서 Section이 차지하는 크기
- Virtual Address : Memory에서 Section의 시작 주소
- Size Of RawData : File에서 Section이 차지하는 크기
- Pointer To RawData : File에서 Section의 시작 주소
- Pointer To Relocations
- Pointer To Line numbers
- Number Of Relocations
- Number Of Line numbers
- Characteristics : Section의 속성이 OR 연산에 의해 나타나있음.
Section의 위치 계산(RVA to RAW)
1. RAW : File 에서의 상대적인 주소 값
2. RVA : Memory 에서의 상대적인 주소 값
3. Pointer To RawData : File 에서의 시작 위치
4. Virtual Address : Memory 에서의 시작 위치
5. RAW to RVA
RAW - PointerToRawData = RVA - Virtual Address
--> RAW = RVA - Virtual Address + Pointer To RawData
실습! 수동 notepad.exe VS PE_View
여기까지의 내용을 기초로 하여 HxD 를 통해 notepad.exe의 정보를 조사하고 PE_View와 비교해보도록 하겠습니다
1. _IMAGE_FILE_HEADER
분류 | 값 |
운영체제의 종류 | 32bit 운영체제 |
Section의 개수 | 3개 |
_IMAGE_OPTIONAL_HEADER의 크기 | 0xE0 |
특징 | 0x010F |
2. _IMAGE_OPTIONAL_HEADER
'Security > RCE' 카테고리의 다른 글
Solution_Lena 01 (0) | 2013.11.30 |
---|---|
(Manual Unpacking 02) UPack Unpacking (0) | 2013.08.18 |
(Manual Unpacking 01) UPX Unpacking (0) | 2013.08.14 |
(이론 02) EFLAGS (0) | 2013.08.13 |
(분석 01) WinSock 기초 분석 (0) | 2013.06.14 |