728x90
PE ( Portable Excutable ) 파일
: 실행 가능한 파일 ( exe, dll, sys, src, ocx 등 )
- Win32 기본 파일 형식 ( 윈도우 환경에서 동작 )
- 메모리 상에서 실행되는 형태 ( = Process ) : exe + dll
예전에는 exe 단독 사용, 윈도우 환경이 커지면서 여러가지 자원을 사용하기 위해 dll도 같이 사용 - 실행 과정
PE 파일 실행 -> 헤더 정보를 메모리에 매핑 -> 실제 프로그램 코드로 들어가서 실행 - 정적 분석에 해당 ( Hex Editor, PEview 등을 사용 )
더보기
※ PE 헤더 정보를 메모리에 매핑
1. 실제 프로세스를 위한 메모리 할당
2. 섹션 정보를 메모리에 복사
3. import 정보 처리
4. 기준 재배치 처리
PEview.exe
< notepad.exe 파일 사용 >
- 프로그램의 실행 영역 ( 실제 데이터 영역과 관련된 헤더 정보 ) : IMAGE_SECTION_HEADER .text
- 실제 데이터 영역 : SECTION .text
notepad.exe의 구조
특징
- 헤더 정보까지는 File과 Memory 동일하다.
- SECTION .text = 실행 영역
- offset은 상대 주소의 개념이고 address는 ( 메모리 상의 ) 실제 주소이다.
- SECTION 부분에서 <Memory>의 Padding 부분이 더 길어짐 ( 실행할 때 메모리 특정 영역 할당 또는 점프해서 돌아오는 등의 행동을 대비해 더 길어짐 )
- < File > 은 메모리가 차곡차곡있는 것이 좋음
- < Memory > 는 주소 매핑을 깔끔( 편리 )하게 하기 위해 기준이 되는 값을 정하고 그 기준을 바탕으로 새로운 섹션에 값을 넣는다.
VA, RVA
VA : 가상 메모리 주소 ( < Memory > 의 Address )
RVA : 가상 메모리 상대 주소 ( < File > 의 offset )
- RVA를 기준으로 소스코드 분석 많이 함
- PE 파일이 메모리 상의 어떤 위치에 올라갈지 모름
- 프로그램 자체에서 정한 상대적 주소
VA = ImageBase + RVA
- 실제 프로그램 실행 상태에서는 VA 중요, 우리가 분석하고 알고 있는 정보는 RVA
※ ImageBase
메모리 상의 어떤 번지에 올라가라, 어느 번지에서 시작하라 를 알려줌
PE 파일 헤더
IMAGE_DOS_HEADER
pFile | Data | Description | Value |
00000000 | 5A4D | Signature | IMAGE_DOS_SIGNATURE MZ |
0000003C | 000000E8 | Offset to New EXE Header |
1. Signature
- 4D 5A ( MZ ) : PE 파일 구조
- Header에서 Signature 정보이고, 그 값은 MZ 이다.
- ' WORD e_magic ' 에 해당
※ 다른 Signature 값
D0 CF 11 E0 : OLE
50 4B : ZIP
25 50 44 46 : PDF
89 50 4E 47 : PNG
2. Offset to New EXE Header
- ' DWORD e_lfanew ' 에 해당
- DWORD e_lfanew : 실제 파일이 시작하는 부분( 주소 )을 알려줌
3. 나머지 부분들
- Value 가 안나와 있는 것은 셋팅이 안됐거나 기본 값( 00 ) 인 것
- ' This program cannot be run in DOS mode ' : window 모드에서 실행 가능한 것
-> 정적 분석을 통해 확인 가능
IMAGE_NT_HEADERS
Signature
- 4byte 공간
- 리틀 엔디안 표기로 인해 '50 45' ( PE ) -> '45 50' ( EP )으로 표기됨
IMAGE_FILE_HEADER
- Machine( CPU ) : 0x8664 - AMD64 CPU
0x014c - Intel CPU 호환 - Number of Sections ( 섹션의 개수 ) : 0x0006
- Time Date Stamp : 0x4A5BC9B3 ( 16진수 ) ----> 1247529395 ( 10진수 )
- Pointer To Symbol Table, Number of Symbols : 00000000 으로 패딩
- Size of Optional Header : 0x00F0 == 64bit
- Characteristics : 파일 형식 정보, OR 연산
0x0002 : 실행 가능한 파일
0x0020 : 64bit 사용
더보기
※ Time Date Stamp 계산 방법
1. 16진수를 10진수로 변경
2. 10진수로 변경된 값은 '초'를 기준으로 한 것이므로 계속 60으로 나눔
3. 기준이 1970년 1월 1일 0시 이므로 60으로 계속 나눠서 나온 값을 기준에 더해줌
※ ( Characteristics ) winnt.h
IMAGE_OPTIONAL_HEADER
값 | 이름 | 의미 | 표시 | |
1 | 0x020B | Magic | 64 구조체 | 노랑(1), BYTE |
2 | 0x0000A800 | Size Of Code | 코드 영역의 크기가 0xa800 | 초록(1), DWORD |
3 | 0x00003570 | Address Of Entry Point | 파일 실행 시 ImageBase + 0x3570부터 시작 | 파랑(1), DWORD |
4 | 0x00001000 | Base Of Code | 코드 영역이 ImageBase + 0x1000부터 시작 | 분홍(1), DWORD |
5 | 0x000000010000000 | Image Base | 주황(1), ULONGLONG | |
6 | 0x00001000 | Section Alignment | 메모리에서 섹션의 크기가 1000의 배수가 되고 빈 공간은 0으로 채움 | 노랑(2), DWORD |
7 | 0x00000200 | File Alignment | 파일에서 섹션의 크기가 200의 배수가 되고 빈 공간은 0으로 채움 | 초록(2), DWORD |
8 | 0x00035000 | Size Of Image | 파일이 로딩 시 전체 크기 0x35000, File Alignment의 배수 | 파랑(2), DWORD |
9 | 0x00000600 | Size Of Header | 헤더의 크기가 0x600 | 분홍(2), DWORD |
10 | 0x02 | Sub System | GUI | 주황(2), WORD |
11 | 0x00000010 | Number of RvaAndSizes | Data Directory 구조체 멤버가 0x10 개 | 노랑(3), DWORD |
더보기
※ IMAGE_OPTIONAL_HEADER 구성 이름
Magic | 실행하는 PE 파일의 구조체가 몇인가?, 0x10B ( 32 구조체 ), 0x20B ( 64 구조체 ) |
Size Of Code | 코드영역 ( .text ) 의 크기 |
Address Of Entry Point | 프로그램이 시작되는 코드의 주소, RVA 값으로 저장함 OllyDbg에서 처음 실행되는 주소 ( = EP ) , 악성코드 시작 지점으로 지정 가능 |
Base Of Code | 코드 영역이 시작되는 상대 주소 ( RVA ) |
Image Base | PE 파일이 메모리에 로드되는 시작 주소 일반적으로 EXE ( 0x400000 ), DLL ( 0x10000000 ) 번지로 설정, RVA 기준 컴파일러에 따라 다른 값 |
Section Alignment | 메모리에서 섹션의 최소 단위, 시작 주소는 이 값의 배수임 |
File Alignment | 파일에서 섹션의 최소 단위, 시작 주소는 이 값의 배수임 |
Size Of Image | PE 파일이 메모리에 로딩될 때 전체 크기 |
Size Of Header | 모든 헤더의 크기 |
Sub System | 1 ( System Driver ), 2 ( GUI ), 3 ( CUI ) |
Number of RvaAndSizes | Data Directory의 구조체 멤버 개수 |
Data Directory | PE 파일에서 중요한 역할을 하는 개체들의 위치 및 크기 |
IMAGE_SECTION_HEADER
SECTION_HEADER 종류
종류 | 용도 |
.text | 실행코드 |
.data | 초기화된 전역변수, static 변수 |
.rdata | Const 변수, 문자열 상수 |
.bass | 전역 변수, static 변수, 문자열, 기타 상수 |
.edata | EAT와 관련된 정보 |
.idata | IAT와 관련된 정보 |
.rsrc | 리소스 정보 |
주요 내용
값 | 멤버 | 의미 | 표시 | |
1 | 0x000000747865742E | Name | 섹션 이름 -> .text | 노랑(1) |
2 | 0x0000A770 | Virtual Size | 메모리 섹션 크기 | 초록 |
3 | 0x00001000 | Virtual Address ( RVA ) | 메모리 섹션의 시작 주소 ImageBase가 0x1 이므로 실제 주소가 0x1001이 됨, Optional Header의 Base of Code와 동일 |
파랑 |
4 | 0x0000A800 | Size Of Raw Data | 파일에서의 섹션 크기 | 분홍 |
5 | 0x00000600 | Pointer To Raw Data | 파일에서의 섹션 시작 위치 | 주황 |
6 | 0x60000020 | Characteristics | 읽고 쓰기가 가능한 코드 섹션 | 노랑(2) |
더보기
※ SECTION_HEADER의 종류
멤버 | 내용 |
Virtual Size | 메모리 섹션의 크기 |
Virtual Address | 메모리 섹션의 시작 주소, RVA |
Size Of Raw Data | 파일에서의 섹션 크기 ( File Alignment의 배수 ) |
Pointer To Raw Data | 파일에서의 섹션의 시작 위치 |
Characteristics | 섹션의 정보 표시, OR연산으로 표시 20000000 ( 실행 ), 4000000 ( 읽기 ), 20 ( 코드 ) |
'악성코드 분석 > 이론' 카테고리의 다른 글
[윈도우즈보안과 악성코드기초] 기초정적분석 2 (0) | 2021.04.08 |
---|