[SUA] PE파일

2020. 5. 4. 01:09정보보안/리버싱

728x90

PE(Portable Executable) 파일은 Windows 운영체제에서 사용되는 실행 파일의 형식이다.

PE 파일은 32bit 형태의 실행 파일을 의미하며 PE32라는 용어를 사용한다

64bit 형태의 실행파일은 PE+, PE32+ 라고 부른다.

 

PE file 종류는 다음과 같다.

종류 실행계열 드라이버계열 라이브러리계열 오브젝트 계열
주요확장자 EXE, SCR(화면보호기) SYS, VXD DLL, OCX(액티브X), CPL, DRV OBJ

 

PE파일을 실행 되기전, PE Header헤더어떻게 메모리에 적재되고, 어디서 부터 실행되어야 하며, 필요한 DLL은 어떤것, 필요한 메모리의 크기등 정보가 저장되어 있다. PE format을 공부하는 것은 PE Header를 공부하는 것과 같다.

 

PE Header Structure

PE Header 내의 정보는 RVA(Relative VA)로 표현 된다.

이는 loading 되는 순간 다른 DLL 파일과 중복되지 않게, Relocation을 위함이다.

 

 

 

1. DOS Header :

                     MS 社는 PE Format을 제정할 때 DOS file에 대한 하위 호환성을 고려하여 만들었다.

                     여기서 DOS Header를 확장시킨 IMAGE_DOS_HEADER (40 byte)가 존재. 

   1-1. e_magic = "MZ" (ASCII) :

                     이 값을 변경하게 되면 Windows에서는 PE파일로 간주하지 않는다.

   1-2. e_lfanew :

                     IMAGE_NT_HEADER의 offser을 가리킨다

 

2. DOS Stub (Optional) : 

                    DOS시스템에서 실행되는 코드가 존재한다. 이 내용은 NT에서는 보이지 않는다.

 

3. NT Header :

                   IMAGE_NT_HEADERS { 시그니쳐 "PE" + File Header + Optional Header) (0xF8 = 248 byte) 로 구성됨

 

   3-1. Signature :

                  이 값이 없다면 Windows에서는 이 파일이 NT 헤더를 가지지 않는 것으로 본다.

   3-2. File Header : 

                 COFF 헤더라고도 부르며 파일의 개략적인 속성을 나타낸다.

                 { 1. CPU 칩 정보,

                   2. Body Section의 개수,

                   3. Size of Optinal Header,

                   4. 파일 속성 (0x002 = exe)

                 }

 

    3-3. Optional Header :

                { 1. Magic Number

                  2. Entry Point Address Number

                  3. Image Base : 메모리에 PE 파일 로딩이 시작되는 주소

                   (exe,dll : 유저영역 0~0x7FFF_FFFF, SYS : 커널 영역 0x8000_0000~0xFFFF_FFFF)

                  4. 메모리에 로드 된 PE 이미지 크기

                  5. 디스크 상의 헤더 크기

                  6. Subsystem ( sys, exe, dll 구분자)

                }

 

4. Section Header :  

                { 1. VS : 메모리에서 점유하는 사이즈

                  2. VA : 시작주소 RVA

                  3. Size RawData : 파일에서 차지하는 크기

                  4. Pointer Raw Data : 파일의 섹션 위치(offset)

                }

                // 파일 크기와, 메모리 로딩 크기는 다름

 

 

 

 

 

 

적재된 메모리와, Raw 데이터 간 계산법
RAW(file offset) = RVA(Memory의 offset위치보고 결정) - VA(VA에서 Section이 속한 offset)+ PointerRawData(File의 base로부터 RVA section이 속한 offset)

- 계산 결과 섹션이 맞지 않을 경우 "정의할 수 없다" 고 한다. 

 

 

 

IAT(Import Addr Table)

EAT(Export Addr Table)