1. PE 구조 개요
- Portable Executable : 윈도우 운영체제에서 사용되는 실행 파일, DLL, object 코드, FON 폰트 파일 등을 위한 파일 형식
- 윈도우 로더가 실행 가능한 코드를 관리하는데 필요한 정보를 캡슐화한 구조체
1) pe 파일 종류
- 실행 계열 : EXE, SCR
- 라이브러리 계열 : DLL, OCX, CPL, DRV
- 드라이버 계열 : SYS, VXD
- 오브젝트 파일 계열 : OBJ
2. PE 파일 구조
- 전체적인 PE 파일 구조
1) 전반적인 구조
- 다양한 정보들이 PE Header에 구조체 형식으로 저장
- 위 그림처럼 Dos Header ~ Section Header를 PE Header
- 그 이후를 PE Body 또는 Section이라 부름
- 파일에서는 offset, 메모리에서는 Virtual Address로 위치를 표시
2) Offset / Virtual Address
- Offset : 파일의 첫 바이트부터 거리
- Virtual Address : 프로세스 가상 메모리의 절대 주소
- RVA : 이미지가 해당 프로세스의 가상 주소 공간 내에 로드되었을 때에 그 시작주소에 대한 상대적 번지 개념/ 메모리 상에서 시작 주소에 대한 PE Offset
3) NULL Padding
- PE 헤더 끝과 각 Section 사이사이에 NULL 값이 존재
- 파일 또는 메모리에서 섹션의 시작위치는 각각 최소 기본 단위의 배수에 해당하는 위치여야하므로 남은 빈 공간을 NULL 채움
4) PE Header
(1) DOS Header
- DOS 파일에 대한 하위 호환성을 고려하여 만들었으나 Win32에서 PE 파일 실행시 NT Header에 대한 offset이 저장되어 있어 해당 주소로 이동
(2) DOS Stub
- DOS 환경에서 실행되는 코드를 가진 영역으로 DOS 환경에서 실행하지 못하는 프로그램 실행 시 “This program cannot be run in Dos mode” 라는 문자열 출력 후 종료
(3) NT Header
- 파일 실행에 필요한 정보 저장
- Signiture : NT Header의 제일 첫 번째 멤버
- File Header : 파일의 계략적인 정보를 나타냄
- Optional Header : 파일 실행에 필요한 주요 정보 저장
(4) Section Header
- 각 Section의 Header가 존재하며 Section들의 메타데이터를 저장하고 메모리에 로드될 때 필요한 정보를 포함
5) Section
(1) 코드
- .text : 프로그램을 실행하기 위한 코드를 담고 있는 섹션, 명령 포인터는 이 섹션 내에 존재하는 번지 값을 가짐
(2) 데이터
- .data : 초기화된 전역 변수들을 담고 있는 읽고 쓰기가 가능한 섹션
- .rdata : 읽기 전용 데이터 섹션으로 문자열 표현이나 C++/COM 가상함수 테이블 등이 배치되는 공간
- .bss : 초기화되지 않은 전역 변수들을 위한 공간, 실제 PE 파일 내에서는 존재하나 가상 주소 공간 매핑 시 .data 섹션에 병합되어 표시
(3) 리소스
- .rsrc : 다이얼로그, 아이콘, 커서 등의 윈도우 APP 리소스 관련 데이터들이 이 섹션에 배치
'Security > Reversing' 카테고리의 다른 글
PE File Format Advance (1) | 2023.07.08 |
---|---|
Calling Convention (함수 호출 규약) (0) | 2023.07.06 |
스택프레임 (0) | 2023.07.05 |
어셈블리어 (0) | 2023.07.02 |
CPU 레지스터 (0) | 2023.07.02 |