PE 구조

배추야펄럭여·2022년 5월 31일
0

PE-Format

목록 보기
1/3
post-thumbnail

PE란 ?

Windows 운영체제에서 사용되는 실행 파일 형식이다

IMAGE_DOS_HEADER

위와 같은 구조체로 이루어져 있다.



1. e_magic : 일반적인 시그니처를 나타낸다 ( 2Byte )


2. e_lfanew : ( NT Header의 시작위치를 알려준다 )


NT_Header

DOS_HEADER의 e_lfanew 위치로 가보면 위와 같은 구조체로 이루어져 있다




1.Signature : 50 45 00 00h("PE") | 시그니처는 고정 값


IMAGE_FILE_HEADER

다음과 같은 구조체로 이루어져 있다.


1.Machine : CPU 별 고유 값

32Bit - 0x014C
64Bit - 0x200

2.NumberOfSections : 섹션의 개수를 나타낸다

-> 위와 같이 3개의 섹션이 존재하는 것을 볼 수 있다


3.SizeOfOptionalHeader : IMAGE_OPTIONAL_HEADER32의 크기를 알려준다 ( 64Bit는 32+ )


4.Characteristics : 파일의 속성일 나타내는 값 ( 비트마다 의미가 있음 )

010F => 0b100001111

IMAGE_OPTIONA_HEADER

제일 중요한 부분이다

1. Magic : 시그니처 값

32Bit : 0x010B
64Bit : 0x020B

2.AddressOfEntryPoint : 프로그램이 작되는 주소 값 (RVA)


3.ImageBase : 가상메모리에서 PE파일이 로딩되는 주소

EIP = ImageBase + AddressOfEntryPoint 로 VA를 설정한다 
=> 위에 메모리에 로딩됐을 때의 주소 값

4.SectionAlignement & FileAlignement : 메모리,파일에 저장된 섹션의 최소 단위


5.SizeOfImage : 가상 메모리에서 PE Image의 크기


6.SizeOfHeaders : PE 헤더의 전체 크기

이 위치에 첫 번째 섹션이 존재한다 0x400

7.SubSystem : 파일을 구분한다

1 : Driver File
2 : GUI File
3 :CUI File 

8.DataDirectory


IMAGE_SECTION_HEADER

위와 같은 구조체로 이루어져 있다

1. VirtualSize : 메모리에서 섹션이 차지하는 크기


2. VirtualAddress : 메모리에서 섹션의 시작주소 (RVA)


3. SizeOfRawData : 파일에서 섹션이 차지하는 크기


4.PointerToRawData : 파일에서 섹션의 시작 위치


부가 설명

위 사진처럼 FILE 기준으로

.text 섹션 시작위치는 0x400 
크기는 0x7800 이다 

그럼 다음 섹션인 .data로 넘어가서 시작되는 주소는 0x7C00이라는 소리이다 

아래 사진들로 보면 


부가 설명 2 ( Section의 실제 메모리 매핑 )

.text 섹션의 RVA의 값은 0x1000 이고 ImageBase는 0x1000000이다

그럼 .text 섹션이 매핑되는 주소는 0x1001000 이라는 소리이다 

해당 주소로 이동해보면

매핑이 되었고 값이 똑같다는 것을 볼 수 있다 
또한 Size 값을 더해주면

0x1001000 + 0x7748 = 0x1008748 인데 해당 주소로 가면 .text 섹션의 마지막 주소이다

profile
열심히 살아보죠

0개의 댓글