20
05 PE Header 02부 리버스 엔지니어링 중급 최일선 E-mail : [email protected] Writing by Ilsun Choi 1

05 pe 헤더(pe header)

Embed Size (px)

Citation preview

Page 1: 05 pe 헤더(pe header)

05 PE Header02부 리버스 엔지니어링 중급

최일선

E-mail : [email protected] Writing by Ilsun Choi 1

Page 2: 05 pe 헤더(pe header)

Index

1. PE 구조를 알아야 할 필요성

2. PE에 대한 상식적인 개념

3. 빌드 과정

4. PE 파일 구조

5. IMAGE_DOS_HEADER

6. IMAGE_NT_HEADER

•1) Signature

•2) 구조체 구성

•3) IMAGE_FILE_HEADER

•4) IMAGE_OPTIONAL_HEADER

7. IMAGE_SECTION_HEADER

8. PE와 API 호출의 원리

9. IAT에서 API를 계산하는 방법

참고문헌

E-mail : [email protected] Writing by Ilsun Choi 2

Page 3: 05 pe 헤더(pe header)

1. PE 구조를 알아야 할 필요성

프로세스 적재

를 위한 정보

API 호출을

위한 IAT

코드 사이즈와

각 섹션의 위치

언패킹

바이러스 분석

안티 디버깅

E-mail : [email protected] Writing by Ilsun Choi 3

Page 4: 05 pe 헤더(pe header)

2. PE에 대한 상식적인 개념

Portable Executable File Format

파일(File)이

+ 이식 가능한 다른 곳에 옮겨져도 (Portable)

+ 실행 가능하도록 (Executable)

+ 만든 포맷(Format)

E-mail : [email protected] Writing by Ilsun Choi 4

Page 5: 05 pe 헤더(pe header)

3. 빌드 과정

E-mail : [email protected] Writing by Ilsun Choi 5

#include <window.h>void main()

0x18, 0x19, 0x01, 0x02, 0x03

Static Link Library

Import Library

PE Header

0x18, 0x19, 0x01, 0x02, 0x03

Footer

Source.h Source.obj

Binary.exe

compile

Link

모든 헤더파일과 소스파일을 합쳐 하나의기계어 코드 생성

DLL, 리소스 데이터, Import, Export 테이블을 처리할 수 있는정보를 윈도우에 약속된 규약에 맞춰 기입

실행파일 로딩 시 PE Header 정보를 토대로 DLL을 로드, 메모리에 적재될 각종 리

소스 할당(PE 헤더 정보 오류시 로딩 불가)

Page 6: 05 pe 헤더(pe header)

4. PE 파일 구조

이와 관련된 공부를 하면 자연스럽게 익히게 됨

PE 구조체

E-mail : [email protected] Writing by Ilsun Choi 6

IMAGE_DOS_HEADERIMAGE_NT_HEADERIMAGE_FILE_HEADERIMAGE_OPTIONAL_HEADERIMAGE_SECTION_HEADERIMAGE_IMPORT_DESCRIPTORIMAGE_EXPORT_DIRECTORYIMAGE_IMPORT_BY_NAMEIMAGE_THUNK_DATA32

Page 7: 05 pe 헤더(pe header)

5. IMAGE_DOS_HEADER

E-mail : [email protected] Writing by Ilsun Choi 7

PE 가장 첫 번째 값으로MZ(마크 즈비코프스키가 개발) 헤더를 통해

MS-DOS 헤더의 시작을 알림(이 바이너리가 PE 파일인지 검사)

IMAGE_NT_HEADER의구조체 위치를 알림

Page 8: 05 pe 헤더(pe header)

6. IMAGE_NT_HEADER > 1) Signature

E-mail : [email protected] Writing by Ilsun Choi 8

Signature : “PE\0\0” : 4바이트바이러스에 자신의 시그니쳐를 심기도 함바이러스나 악성코드 감염 표식용으로 사용

Page 9: 05 pe 헤더(pe header)

6. IMAGE_NT_HEADER > 2) 구조체 구성

E-mail : [email protected] Writing by Ilsun Choi 9

Page 10: 05 pe 헤더(pe header)

6. IMAGE_FILE_HEADER > 3) IMAGE_FILE_HEADER[1/2]

E-mail : [email protected] Writing by Ilsun Choi 10

어떤 CPU에서 실행 가능한지 알림(일반 Desktop, Labtop에서 사용할 경우, 별로

필요 없음)

이 파일이 가진 세션의 개수를 알림(일반적으로 .text, .rdata, .data, .rsrc

4개 섹션이 존재)

obj EXE 파일을 만든 시간을 알림(델파이로 만들어진 파일은 항상 1992년으로

표시됨)

Page 11: 05 pe 헤더(pe header)

6. IMAGE_FILE_HEADER > 3) IMAGE_FIEL_HEADER[2/2]

E-mail : [email protected] Writing by Ilsun Choi 11

IMAGE_OPTIONAL_HEADER32의구조체 크기를 알림

(PE를 로딩하기 위한 굉장히 중요한 구조체를담고 있음, 운영체제마다 크기가 다를 수 있어

PE 로더에서는 이 값을 먼저 확인)

이 파일이 어떤 형식인지 알림

Characteristics num Characteristics num

IMAGE_FILE_RELOCS_STRIPPED 0x0001 IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020

IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 IMAGE_FILE_BYTES_REVERSED_LO 0x0080

IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 IMAGE_FILE_32BIT_MACHINE 0x0100

IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 IMAGE_FILE_DEBUG_STRIPPED 0x0200

IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010 IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400

#define Characteristics

Page 12: 05 pe 헤더(pe header)

6. IMAGE_FILE_HEADER > 4) IMAGE_OPTIONAL_HEADER [1/3]

E-mail : [email protected] Writing by Ilsun Choi 12

32bit 0x10B64bit 0x20b

코드 양의 전체 크기악성코드 : 이 값을 참고하여 자신의코드를 복제할 위치 기준을 잡음

보안 솔루션 : 코드 섹션의 무결성 검사

Standard Fields

사용한 컴파일러 버전

파일이 메모리에서 실행되는 시작 지점

실행 코드 위치(ImageBase와 BaseofCode를더한 값부터 코드 시작)

Page 13: 05 pe 헤더(pe header)

6. IMAGE_FILE_HEADER > 4) IMAGE_OPTIONAL_HEADER [2/3]

E-mail : [email protected] Writing by Ilsun Choi 13

로드할 가상 메모리 주소

각 세션을 정렬하기 위한 정렬 단위(보통 0x1000)

NT additional feilds

EXE/DLL이 메모리에 로딩되었을 때전체 크기

PE 헤더의 크기를 알려줌( 기본값 0x1000 )

구조체: VirtualAddress와 Size 필드(Export, Import, Rsrc 디렉터리와 IAT 등의 가상

주소와 크기 정보)

Page 14: 05 pe 헤더(pe header)

6. IMAGE_FILE_HEADER > 4) IMAGE_OPTIONAL_HEADER [3/3]

E-mail : [email protected] Writing by Ilsun Choi 14

RVA (Relative Virtual Address) : 상대주소

NT Header -> Data Directory

IAT 시작 주소IMAGEBASE(0x01000000) + RVA(0x7604)

= 0x1007604

Page 15: 05 pe 헤더(pe header)

7. IMAGE_SECTION_HEADER

주로 각 섹션에 대한 이름, 시작 주소, 사이즈 등의 정보를 관리하는 구조체

E-mail : [email protected] Writing by Ilsun Choi 15

MEM_READ, MEM_EXECUTE, MEM_WRITE는 각 세션의 RWE 속성을 나타냄

Page 16: 05 pe 헤더(pe header)

8. PE와 API 호출의 원리

E-mail : [email protected] Writing by Ilsun Choi 16

IAT에는 해당 함수의실제 주소가 들어있다.

IAT 주소에 쓰인 값을참조한다.

실제주소를 참고하여CALL하는 위치이다.

msvcrt.__set_app_type 함수 호출 과정

Page 17: 05 pe 헤더(pe header)

9. IAT에서 API를 계산하는 방법

[Stud_PE] – [Functions] – [ADVAPI32.dll] – [MORE]

E-mail : [email protected] Writing by Ilsun Choi 17

Page 18: 05 pe 헤더(pe header)

9. IAT에서 API를 계산하는 방법

[Stud_PE] – [Functions] – [ADVAPI32.dll] – [RegQueryValueExW]

E-mail : [email protected] Writing by Ilsun Choi 18

Page 19: 05 pe 헤더(pe header)

IMAGE_IMPORT_BY_NAME

0x00007CA2

9. IAT에서 API를 계산하는 방법

IAT 호출 과정

E-mail : [email protected] Writing by Ilsun Choi 19

IMAGE_THUNK_DATA32

0x000076CC

IMAGE_IMPORT_DESCRIPTION

Name : ADVAPI32.dll

이와 관련된 자세한 사항을 보려면 코드를 직접 분석 해보면 된다. http://blog.naver.com/isc0304/220388240818Export Table은 IAT와 유사하여 IAT를 익히면 자연히 알 수 있다.

Page 20: 05 pe 헤더(pe header)

참고문헌

리버싱 엔지니어링 바이블, 강병탁 지음

E-mail : [email protected] Writing by Ilsun Choi 20