Reversing/윈도우즈보안과악성코드기초
PE 파일 구조
와븨
2024. 3. 29. 18:25
PE (Portable Excutable) 파일
- Win32 기본파일 형식
- exe, scr, sys, dll, ocx 등
- Process : EXE + DLL
- 실행과정
- PE 파일 실행
- PE 헤더 정보를 메모리에 매핑
- 실제 프로세스를 위한 메모리 할당
- 섹션 정보를 메모리에 복사
- Import 정보 처리
- 기준 재배치 처리
- 실제 프로그램 코드로 분기
https://learn.microsoft.com/ko-kr/windows/win32/debug/pe-format
PE 형식 - Win32 apps
이 사양은 Windows 운영 체제 제품군에 있는 실행 파일(이미지) 파일 및 개체 파일의 구조를 설명합니다. 이러한 파일은 각각 PE(이식 가능한 실행 파일) 및 COFF(공용 개체 파일 형식) 파일이라고 합
learn.microsoft.com
Notepad.exe(win7) 분석
실행 파일을 PEview에서 열면 위와 같다.
VA, RVA
- VA(Virtual Address) : 가상 메모리 주소
- RVA(Relative Virtual Address)
- 가상 메모리 상대 주소
- PE 파일(DLL)이 메모리 상의 어떤 위치에 올라갈지 알 수 없음
- 기준점을 놓고 그 곳으로부터 위치를 계산함
- 기준점이 바뀌더라도 정보 접근이 가능하도록 함
- VA = ImageBase + RVA
IMAGE_DOS_HEADER
이는 winnt.h를 보면 쉽게 분석할 수 있다.
e_magic
- 4D 5A(MZ) : PE 파일 구조
- DO CF 11 E0(OLE), 50 4B(ZIP), 25 50 44 46(PDF), 89 50 4E 47(PNG)
e_lfanew
- 000000E8 : IMAGE_NT_HEADER 시작 주소
notepad.exe는 4D 5A로 PE 파일 구조이며, IMAGE_NT_HEADER 시작 주소가 000000E8임을 알 수 있다.
DOS Stub Code
프로그램이 DOS 모드에서는 실행할 수 없는 파일이므로, 윈도우에서 실행해야 함을 알 수 있다.
NT_HEADER
File_Header
- Machine(CPU) : 0x8664 - AMD64 CPU 호환(0X014c intel CPU)
- 섹션의 개수 : 0x0006
- Time Data : 0x4A5BC9B3 → 1247529395
- 2009년 7월 13일 23시 56분 35초
- Pointer To Symble Table, Number of Symbols
- Size Of Optional Header : 0xE0(32bit), 0xF0(64bit), 0x00(obj)
- Characteristics : 파일형식 정보, OR 연산
이 중, Chracteristics를 winnt.h 보면 다음과 같다.
Optinal_Header
이를 정리하면 밑의 표와 같다.
값 (notepad.exe) |
이름 | 의미 |
0x010b | Magic | 0x10B(32구조체), Ox20B(64구조체) |
0xa800 | Size Of Code | 코드영역(.text)의 크기 |
0x3689 | Address Of Entry Point | 프로그램 시작되는 코드의 주소 RVA값으로 저장 OllyDbg에서 처음 실행되는 주소(악성코드 시작 지점으로 지정할 수 있음) |
0x1000 | Base Of Code | 코드영역이 시작되는 상대 주소(RVA) |
0x1000000 | Image Base | PE파일이 메모리에 로드되는 시작 주소 일반적으로 EXE(0x400000), DLL(0x10000000)번지로 설정(변경가능), RVA 기준 |
0x1000 | Section Alignment | 메모리에서 섹션의 최소 단위, 시작주소는 이 값의 배수 |
0x200 | File Alignment | 파일에서 섹션의 최소 단위, 시작주소는 이 값의 배수 |
0x30000 | Size Of Image | PE 파일이 메모리에 로딩될 때 전체 크기 |
0x400 | Size Of Header | 모든 헤더의 크기 |
0x2 | Sub System | 1(System Driver), 2(GUI), 3(CUI) |
0x10 | Number of RvaAndSizes | Data Directory의 구조체 멤버 개수 |
Data Directory | PE파일에서 중요한 역할을 하는 개체들의 위치 및 크기 |
Section_Header
Section Header의 종류
종류 | 용도 |
.text | 실행 코드 |
.data | 초기화된 전역 변수, static 변수 |
.rdata | Const 변수, 문자열 상수 |
.bss | 전역 변수, static 변수, 문자열, 기타 상수 |
.edata | EAT와 관련된 정보 |
.idata | IAT와 관련된 정보 |
.rsrc | 리소스 정보 |
주요 내용
값 (notepad.exe) |
멤버 | 의미 |
0x747865742E | Name | 섹션 이름 .text |
0xA770 | Virtual Size | 메모리 섹션 크기 정보 |
0x1000 | Virtual Address | 메모리 섹션의 시작 주소. - Image Base가 0x1이므로 실제 주소는 0x1001이 됨, Optional Header의 Base of Code 값과 동일 |
0xA800 | Size Of Raw Data | 파일에서의 섹션 크기 |
0x600 | Pointer To Raw Data | 파일에서의 섹션의 시작 위치 |
0x60000020 | Characteristics | 읽고 쓰기가 가능한 코드 섹션 |