-
PE 파일(정리) -1Reversing 2019. 2. 10. 12:36
(* 본 글은 리버싱 핵심원리와 다른 블로그들의 글들을 보고 대충 정리해본 것입니다.
혹여 사실이 아닌 부분이 있다면 피드백 남겨주시면 감사하겠습니다.)
PE 파일 : 윈도우 운영체제에서 사용되는 실행 파일 형식.
- 기존 유닉스에서 사용되는 COFF를 기반으로 MS에서 만들었다.
- PE(Portable Executable)의 뜻에 맞게 다른 운영체제에도 이식성을 좋게끔 하려는 의도였음
(다만 실제로는 윈도우즈 계열의 운영체제에서만 사용됨.)
- 기본적으로 32비트 형태의 실행 파일을 의미함. (PE32라는 용어를 사용하기도 함.)
- 64비트 형태의 실행 파일은 PE64가 아닌 PE+ 혹은 PE32+라고 부른다.(PE 파일의 확장 형태)
PE FIle Format
종류 : 실행 계열, 드라이버 계열, 라이브러리 계열, 오브젝트 파일 계열
실행 계열 : EXE, SCR
드라이버 계열 : SYS, VXD
라이브러리 계열 : DLL, OCX, CPL, DRV
오브젝트 파일 계열 : OBJ
(NULL Padding : PE 헤더, 각 섹션의 끝에 있는 영역.
존재 이유 : 컴퓨터에서 파일, 메모리, 네트워크 패킷 등을 처리할 때 효율을 높이기 위해
최소 기본 단위를 맞추게 해줌.
섹션 시작의 메모리 주소가 00000010이고 PE 헤더의 끝이 00000008일 경우, 추가적으로 00000008만큼
NULL로 채운다는 말인 것 같다. - 메모리는 16진수니까.. 애매한 설명인듯.)
VA : Virtual Address, 프로세스 가상 메모리의 절대주소
RVA : Relative Virtual Address, ImageBase(기준 위치)에서부터의 상대주소
=> VA = RVA + ImageBase
(ex. VA가 8을 가리키고, ImageBase가 2를 가리킨다면 RVA는 6을 가리킬 것 - 단순히 이해를 돕기 위한 예시입니다.)
* RVA가 자주 쓰이는 이유 : PE 파일(주로 DLL 파일)이 프로세스 가상 메모리에 로딩되는 순간, 이미 그 위치에
다른 PE파일(DLL)이 로딩되어 있을 수 있음.
그 과정에서 재배치(Relocation) 과정을 통해 비어있는 다른 위치에 로딩되어야 함. 근데 만약 이 위치가 모두 VA\
일 경우, 정상적인 액세스가 일어나지 않으므로 원래 절대주소와 연결되어있는 다른 상대주소를 활용하는 것이다.)
PE Header (주인장이 막힌 부분 - 뭔가 외울 게 많아 보인다. 막막했음)
1. DOS Header(Microsoft에서 PE 파일을 만들 때 당시에 보편화돼있던 DOS 파일을 나중에도 쓸 수 있도록 만듬)
-> 기존 DOS EXE Header를 확장시킨 IMAGE_DOS_HEADER 존재
- 위치: PE 파일의 제일 앞 부분
- 존재 이유: 약간 C의 #include <stdio.h> 와 같은 역할이라고 생각함. 처음부터 "이 파일은 무슨 파일이다"를
소개하는 역할을 하기 때문이랄까
중요한 멤버) e_magic, e_lfanew
e_magic : DOS signature 4D5A(아스키코드값 MZ)
e_lfanew : NT header의 옵셋 표시
( * 실습할 때에는 HxD로 메모장(notepad.exe)을 열어 보자)
( ** 이 때 HxD에서 4D5A를 제외한 나머지 값은 리틀 엔디언으로 해석해야 한다. 4D5A는 왜 리틀 엔디언이 아닐까?)
( *** 이런 조건들을 맞춰줘야 정상적으로 프로그램이 실행된다. 처음부터 정해져 있는 PE 파일의 특성이기 때문(?))
2. DOS Stub(존재 여부 : 옵션, 크기 일정 X, 없어도 파일 실행 자체에는 문제가 없다. 왜 있을까?)
- 위치 : IMAGE_DOS_HEADER 그 다음부터 NT Header 구조체 전까지.
- DOS 환경에서 실행하거나, DOS용 디버거를 이용해서 실행하면 DOS Stub에 있는 코드를 실행시킬 수 있다.
- 근데 진짜 왜 있는거지?? 아는 사람ㅠㅠㅠ
3. NT Header
부터는 PE 파일 - 2에서 계속하겠습니다
'Reversing' 카테고리의 다른 글
이쯤에서 쓰는 codeengn basic 이후의 공부 계획 (0) 2019.05.11 PE 파일(정리) - 2 (0) 2019.02.11