악성코드 분석/이론

[윈도우즈보안과 악성코드기초] PE 파일

レ(゚∀゚)ヘ=3 2021. 3. 28. 04:00
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 > : 실제 메모리에 올라가 있는 실행 상태

 

특징

  1. 헤더 정보까지는 File과 Memory 동일하다.
  2. SECTION .text = 실행 영역
  3. offset은 상대 주소의 개념이고 address는 ( 메모리 상의 ) 실제 주소이다.
  4. SECTION 부분에서 <Memory>의 Padding 부분이 더 길어짐 ( 실행할 때 메모리 특정 영역 할당 또는 점프해서 돌아오는 등의 행동을 대비해 더 길어짐 ) 
  5. < File > 은 메모리가 차곡차곡있는 것이 좋음
  6. < 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 : 실제 파일이 시작하는 부분( 주소 )을 알려줌 

Offset to New EXE Header를 나타내는 ' E8 00 00 00 ', 그리고 실제 파일이 시작하는 ' 50 45 00 ... ' 값을 볼 수 있음

 

3. 나머지 부분들

  • Value 가 안나와 있는 것은 셋팅이 안됐거나 기본 값( 00 ) 인 것
  • ' This program cannot be run in DOS mode ' : window 모드에서 실행 가능한 것
     -> 정적 분석을 통해 확인 가능

 

 


 

 

IMAGE_NT_HEADERS

 

 

Signature

 

  1. 4byte 공간
  2. 리틀 엔디안 표기로 인해 '50 45' ( PE ) -> '45 50' ( EP )으로 표기됨

 

IMAGE_FILE_HEADER

 

 

  1. Machine( CPU ) : 0x8664 - AMD64 CPU 
    0x014c - Intel CPU 호환
  2. Number of Sections ( 섹션의 개수 ) : 0x0006
  3. Time Date Stamp : 0x4A5BC9B3 ( 16진수 ) ----> 1247529395 ( 10진수 )
  4. Pointer To Symbol Table, Number of Symbols : 00000000 으로 패딩
  5. Size of Optional Header : 0x00F0 == 64bit
  6. 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 ( 코드 )