EASY7
PE 구조에 대한 이해 본문
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
세부 구조
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-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로 시작하는 것을 알 수 있다.
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구조를 분석해 정보 얻기
이름 | 용도 | 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 |