EASY7

PE 구조에 대한 이해 본문

보안 공부/리버싱

PE 구조에 대한 이해

E.asiest 2019. 10. 27. 23:47

PE 구조에 대한 이해

PE파일은 윈도우에 해당하는 파일 포맷으로 .exe, .dll, .cpl, .sys, .scr, .drv, .vxd, .ocx확장자가 있다.
실행파일 계열 : EXE, SCR(screen saver)

라이브러리 계열 : DLL, OCX(Active X)

드라이브 계열 : SYS
오브젝트 파일 계열: OBJ

 

PE 구조에서 사용되는 용어

-ImageBase

 : 실행 파일이 메모리에 로드 될 때 주소

-Entry Point(EP)

 : 실행 파일이 메모리에 로드 된 후 처음 실행되는 주소

-Alignment

 : 각 섹션에 할당된 공간

  일반적으로 섹션에 1000이 할당되며, 파일에는 200이 할당된다.

  RVA(Relative Virtual Address) : 메모리에 로드될 때, ImageBase에서 떨어진 값

  Virtual Address= ImageBase+RVA

 

 

세부 구조

출처:https://blog.kimtae.xyz/8

 

1. DOS Header

: PE구조를 가지고 있는 파일인지 판단할 수 있다.

"4D 5A"로 시작해서 64byte까지 DOS Header부분이다.

 

**WINNT.H에서 _IMAGE_DOS_HEADER 구조체

눈여겨 볼 필드는 e_magic과 e_lfanew이다.

e_magic

4D 5A는 MZ라는 문자열로 PE구조를 개발한 Mark Zbikowski의 이름을 의미한다.('마크 비코우스키' 라고 읽음)

e_magic

e-lfanew

DOS Header의 마지막 4byte로 NT Header 구조체의 시작 오프셋 값을 가지고 있다.

인텔 계열 컴퓨터는 4byte씩 역순으로 저장되는 리틀 엔디안 방식으로 사용된다.(16진수에서 0~F하나의 문자열은 4bit이므로, 00~FF는 8bit(1byte)이다.)

"F0 00 00 00"라고 되어있지만 "00 00 00 F0"라고 읽으면 된다.

"00 00 00 F0" 주소로 가면 PE로 시작하는 것을 알 수 있다.

 

e_lfanew

 

 

2. DOS Stub

: DOS 모드에서 실행되었을 때 실행할 내용을 나타낸다.

65byte~ PE전까지 이다.

오른쪽 ASCII Code에서 "This program cannot be run in DOS mode"라는 메세지를 띄울것이다.

 

3. NT Header

WINNT.H 구조체의 e_lfanew에 저장된 주소값이 바로 이 부분을 가리킨다.

파일 실행에 필요한 정보가 저장되어 있다.

Signature : "50 45 00 00" 4byte 공간으로 ASCII Code로 PE라는 문자열을 나타낸다.

File Header : 동작하는 CPU, 섹션의 수, 생성 시간 등 파일의 대략적인 정보를 나타낸다.

Optional header : 파일의 실행에 필요한 주요 정보를 저장한다.

(자세한 내용은 https://blog.kimtae.xyz/8에 잘 나와있다)

 

4. Section Header

섹션의 종류

종류 내용
.text 파일을 열었을 때 실행될 코드가 저장된다.
.data 초기화된 전역변수, static 변수를 저장한다.
.rdata const 변수(상수), 문자열 상수를 저장한다.
.bss 초기화 되지 않는 전역 변수, static 변수, 문자열, 기타 상수가 저장된다. 최기화가 진행되면 data영역으로 이동한다.
.edata EAT와 관련된 정보가 저장된다.(export) 커스텀해서 만든 라이브러리
.idata IAT와 관련된 정보가 저장된다.(import) 함수가 잇는 라이브러리
.rsrc 리소스가 저장된다.

 

** 정리 **

계산기 파일(calc2.exe)의 PE구조를 분석해 정보 얻기

calc2.exe
0.11MB

이름 용도 Calc.exe의 값
DOS Header 파일이 PE구조임을 나타냄 4D 5A(MZ)
DOS Stub DOS에 실행될 때 표시할 내용 This Program cannot be run in DOS mode
NT Header
Machine CPU 타입 4c 01 -> 0x014c(Intel 386)
Number os Section PE파일을 구성하는 섹션의 수 03 00 -> 0x0003(text,data, rsrc-3개 구성)
Time Data Stamp PE파일이 만들어진 시간

10 84 7D 3B->0x3B7D8410

=998081552(십진수)

2001-8-18 5:52:32 

Size of Optional Header

Optional Header의 크기(운영체제에 따라 다름)

E0 00->0x00E0=224(32bit운영체제)
Characteristics 현재 파일의 형식을 알려줌

0F 01->0x010F(0100와000F의 OR연산결과)

0100 : 32bit machine

000F : ??

Optional Header
Magic

Optional Header가 32구조체인지, 64구조체인지 나타냄.

0B 01-> 0x010B(32bit)
SIze of Code 코드 영역(.text section)의 크기 07 00->0x0007
Address Of Entry Point

프로그램이 시작되는 코드의 주소가 RVA값으로 나타남.(Optional Header에서 44byte 또는 40byte 후에 나옴)

Olly DBG를 실행시키면 처음 실행되는 위치(HxD의 위치가 아님!)

75 24 01 00->0x00012475

Base of Code 코드 영역이 시작되는 상대주소(RVA) 00 10 00 00->0x00000100
Image Base

파일이 메모리에 로드되는 시작주소(Optional Header에서 52byte 후에 나옴)

exe파일: 0x00400000

dll파일 : 0x10000000 로 설정되어 있으나 설정에 따라 달라질 수 있음.

RVA의 기준이 됨.

0x01000000

(exe파일임에도 불구하고 0x10000000이네..)

Section Alignment

메모리에서 섹션의 최소 단위

메모리 섹션의 시작주소는 반드시 section alignment의 배수가 된다.

0x00001000

Size of Image

PE파일이 메모리에 로딩되었을 때 전체 크기 0x00000200
Sub System

system driver 파일, GUI, CUI파일 구분

1:system driver file

2:GUI file

3:CUI file

0x0002(GUI파일)
.text Section
Name 섹션의 종류 text
Virtual Size 메모리에서 섹션의 크기 0x000126B0
Virtual Address 메모리에서 섹션의 주소(OllyDbg에서 확인 가능)(.text나오고 12byte후에 나옴) 0x00100000
Size of Raw Data 파일에서의 섹션의 크기 0x00102800
Pointer To Raw Data

파일에서 섹션이 시작되는 주소

(HxD에서 확인가능)

0x00000400

 

 

PE 구조 쉽게 보는 법

1. CFF Explorer이용하기

NT Header-Optional Header에 EP, ImageBase 볼 수 있다.

2. PEView 이용

 

3. 010Editor 이용

 

 

 

**PE구조에서 구조체 정보 알 수 있는 곳!

https://docs.microsoft.com/ko-kr/windows/win32/debug/pe-format?redirectedfrom=MSDN#overview

 

'보안 공부 > 리버싱' 카테고리의 다른 글

msdn  (0) 2019.10.28
010 editor 툴  (0) 2019.10.28
OllyDbg 단축키  (0) 2019.10.24
IDA 단축키  (0) 2019.10.24
패킹, 언패킹  (0) 2019.10.14
Comments