본문 바로가기

공부/리버싱

리버싱 공부 13

<리버싱 핵심 원리>로 공부하였다.

 

2부 PE File Format

https://msdn.microsoft.com/en-us/library/ms809762.aspx

13 PE File Format

1. PE 파일 : Windows 운영체제에서 사용되는 실행 파일 형식(원래는 다른 운영체제에 이식성을 좋게 하려는 의도였음)

32비트 형태 : PE 파일, PE32 / 64비트 형태 : PE+, PE32+라고 부른다.

 

2. PE File Format

PE 파일의 종류는 다음과 같다.

종류 주요 확장자
실행 계열 EXE, SCR
라이브러리 계열 DLL, OCX, CPL, DRV
드라이버 계열 SYS, VXD
오브젝트 파일 계열 OBJ

이 중 OBJ 파일 제외하고 모두 실행 가능하다. 실행 계열이 아닌 것들은 다른 형태의 방법(디버거 등)으로 실행이 가능!

 

notepad.exe

메모장을 HxD에서 열어보았다. 위 사진에 앞쪽이 PE파일의 헤더 부분이다. PE 헤더에 파일이 실행되기 위해 필요한 모든 정보가 구조체 형식으로 저장되어 있다.

 

PE 파일이 메모리에 로딩되는 모습

DOS header ~ Section header : PE Header

그 밑의 Section : PE Body

파일에서는 offset, 메모리에서는 VA(Virtual Address, 절대주소)로 위치를 표현한다.

파일이 메모리에 로딩되면 모양이 달라진다(Section의 크기, 위치 등)

파일의 내용은 보통 코드(.text), 데이터(.data), 리소스(.rsrc) 섹션에 나뉘어서 저장된다.

 

섹션 헤더에 각 섹션에 대한 파일/메모리에서의 크기, 위치, 속성 등이 정의되어 있다. PE 파일 사이사이에 NULL padding 영역이 존재한다. 이는 컴퓨터에서 파일, 메모리, 네트워크 패킷 등을 처리할 때 효율을 높이기 위해 최소 기본 단위 개념을 사용하는데, PE 파일에도 같은 개념이 적용된 것이다.

즉, 섹션 시작 위치는 최소 기본 단위의 배수에 해당하는 위치여야 하고 빈 부분은 NULL로 채운 것이다!

 

VA : 프로세스 가상 메모리의 절대주소

RVA : 어느 기준 위치(ImageBase)에서부터의 상대주소

RVA + ImageBase = VA

 

PE 헤더 내 정보는 주로 RVA 형태 - PE 파일이 프로세스 가상 메모리의 특정 위치에 로딩되는 순간 이미 그 위치에 다른 PE 파일이 로딩되어 있을 수 있기 때문. 이 때 재배치 과정을 통해 비어 있는 다른 위치로 로딩되어야 하는데 만약 PE 헤더 정보가 VA로 되어 잇으면 정상적인 액세스가 이루어지지 않을 것이다. 

 

3. PE 헤더

① DOS Header

- DOS 파일에 대한 호환성을 고려하여 만든 헤더

- 헤더의 앞 부분에 기존 DOS EXE Header를 확장시킨 64바이트 크기의 IMAGE_DOS_HEADER 구조체가 존재

- 주요 필드 : e_magic : DOS signature(4D 5A)

IMAGE_DOS_HEADER 구조체

e_magic : DOS signature (4D 5A => ASCII 값 "MZ")

e_lfanew : NT header의 offset 표시 (파일에 따라 가변적인 값 가짐)

모든 PE 파일은 시작 부분에 DOS signature가 존재하고 e_lfanew 값이 가리키는 위치에 NT Header 구조체가 존재한다.

notepad.exe의 IMAGE_DOS_HEADER 부분

e_magic 값은 4D4A, e_lfanew 값은 000000E0(리틀 엔디언 방식)이다.

 

② DOS Stub

존재 여부가 옵션이며 크기도 일정하지 않다. 코드와 데이터의 혼합으로 이루어져 있고 아래는 메모장의 DOS Stub이다.

notepad.exe의 DOS Stub 부분

40~4D 부분은 16비트 어셈블리 명령어다. 32비트 Windows OS에서는 이쪽 명령어가 실행되지 않는다. 대신에 DOS 환경에서 실행하거나 DOS용 디버거를 이용해 실행하면 저 코드를 실행시킬 수 있다. (DOS EXE 파일로 인식해서!)

 

③ NT Header

IMAGE_NT_HEADERS 구조체
notepad.exe의 IMAGE_NT_HEADERS

Signature : 50450000와 File Heade와 Optional Header 구조체 멤버 존재

 

④ NT Header - File Header

IMAGE_FILE_HEADER 구조체

파일의 개략적인 속성을 나타냄

- Machine : CPU별 고유한 값. 32비트 Intel x86 호환 칩은 14C의 값을 가진다.

Machine 넘버

- NumberOfSections : 섹션의 개수, 반드시 0보다 커야하고 정의된 섹션 개수와 실제 섹션이 다르면 에러 발생

- SizeOfOptionalHeader : IMAGE_NT_HEADERS 구조체의 마지막 멤버인 IMAGE_OPTIONAL_HEADER32 구조체의 크기를 나타낸다. 

- Characteristics : 파일의 속성을 나타내는 값(실행 가능한지, dll 파일인지 등 정보를 bit OR 형식으로 조합)

Characteristics

참고로 Characteristics 값이 not executable 한 경우도 존재하는데 바로 *.obj같은 파일 및 resource DLL 파일 등이다.

notepad.exe의 IMAGE_FILE_HEADER

⑤ NT Header - Optional Header

⑥ 섹션 헤더

 

Optional Header, 섹션 헤더에 대한 부분은 이전에 정리한 내용이 있어서 링크 대체https://pepperhaneul.tistory.com/85?category=890252 

 

그 뒷부분인 IAT, EAT도 링크 대체

https://pepperhaneul.tistory.com/89?category=890252 

 

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

리버싱 공부 11  (0) 2022.01.16
리버싱 공부 10  (0) 2022.01.16
리버싱 공부 09  (0) 2022.01.16
리버싱 공부 08  (0) 2022.01.09
리버싱 공부 07  (0) 2022.01.09