Tuuna Computer Science

PE파일 포맷 구조 정리 본문

Reversing

PE파일 포맷 구조 정리

GuTTe 2018. 6. 21. 23:48

PE파일 포맷에 대해 다룰것이다. 필자가 공부한것을 정리하니 글이 이상할 수 있다. 


일단 먼저 IMAGE_DOS_HEADER부터 보자. 

여기서 볼건 Signature과 Offset to New EXE Header이다. 

signature은 윈도우의 PE스펙을 제작한 MZ를 나타내고 

Offser to New EXE Header은 다음 헤더인 IMAGE_NT_HEADER가 파일크기상에서 어떤 위치에 자리잡는지 나타낸다. 


이제부턴 IMAGE_NT_HEADER이다. 

IMAGE_NT_HEADER은 3개의 구조체로 나뉘는데 첫 번째는 Signature이다 이는 PE를 나타낸다. 


두 번째 구조체는 IMAGE_FILE_HEADER구조체이다. 좀 더 살펴 보겠다. 

여기서 눈 여겨볼게 몇개 존재한다. 

먼저 Machine값은 CPU고유의 값을 나타낸다. 예를 들어 32bit intel 호환칩은 14C값을 나타낸다. 

그리고 Number of Sections는 이 PE파일이 가지고 있는 Section의 개수를 나타낸다. 

그리고 Size of Optional Header은 다음으로 소개할 IMAGE_OPTIONAL_HEADER구조체의 크기를 명시해 놓은것이다. 

여기서 중요한건 첫 번째 섹션의 시작위치는 Size of Optional Header 다음이 아니라  Size of Optional Header + Size of Optional Header이다. 



다음은 IMAGE_OPTIONAL_HEADER구조체를 살펴보겠다. 

먼저,  Magic넘버를 보자. Magic넘버는 이 실행파일이 32bit인지 64bit인지를 나타낸다.  32bit일시 10B를 나타낸다. 

그리고 Address of Entry Point는 프로그램이 최초로 실행되는 값을 지닌다.  흔히 ImageBase값을 더한 값이 실제 EIP를 나타낸다

다음으로 Section Alignment은 이는 가상메모리내에서 실행되는 섹션의 최소단위를 의미한다.

이와 비슷한 걸로 FIleAlignment가 있는데 이는 파일내에서의 섹션의 최소단위를 의미한다. 

ImageBase는 프로세스의 가상메모리에 PE파일이 로딩되는 시작주소이다. 

흔히 EIP는 ImageBase + Address of EntryPoint다

또한 VA(절대주소) = Image + RVA(상대주소)다 이는 PE파일에 대해서 설명다하고 나중에 할것이다. 

Size of Image는 PE파일이 가상메모리에 로딩되었을 때 가상메모리내에서 PE IMAGE가 차지하는 크기를 의미한다. 

이와 비슷하게 Size of Header는 헤더의 전체크기를 나타낸다. 이값은 FIleAlignment의 배수가 되야겠지? Size of Image도 Section Alignment의 배수가 되야된다. 

그리고 좀 더 추가하면 파일내에서 SIze of Header의 값만큼 더한 값 뒤에 섹션에 대한 정보가 붙는다. 

Subsystem은 이 PE파일이 어떤 종류인지 나타낸다. 

흔히 나타나는 값은 01, 02, 03이 있는데 각 각 (시스템 드라이버, 창 기반, 콘솔 기반)을 의미한다. 

마지막으로 Number of Data Directiories는 이 PE파일이 어떤 API를 Import하는지 export하는지 알 수 있다.     


마지막으로 SECTION_HEADER이다. 

일단 먼저 알아야할 것은 

Virtual Address, RVA, Pointer to Raw Data, RAW이다.   

이는 좀 이따 알아보고 

Size of Raw Data에 대해서 알아볼것이다. 이는  파일에서의 섹션이 차지하는 크기이고 
Virtual Size는 가상메모리에서 차지하는 섹션의 크기이다. 

이제 위에 말한걸 좀더 자세히 살펴보겠다. 

HXD로 실행파일을 열었을 때 RAW를 찾을 필요를 느낄 때가 있다. 그래서 이를 구하는 공식이는 있는데 한 번 살펴보자 

RAW - Pointer to Raw Data = Virtual Address - RVA이다 

여기서 가장 중요한 것은 이것들에 대한 개념이다. 기본에 충실해야 한다. 이 글을쓰는 필자도 기본을 까먹어 다시 정리하는 것이다... 

그럼 다시 본론으로 

RAW는 파일내에서 특정한 것에 대한 값을 나타낸다. 예를 들어 이 실행파일 내에서 사용된 API의 주소등등을 찾을 때... 

Pointer to Raw Data는 파일내에서 시작되는 섹션의 크기위치를 의미한다. 

그리고 Virtual Address는 가상메모리 내에서 세션이 시작되는 위치를 의미한다. 

그리고 RVA는 RAW와 비슷한 개념으로 가상메모리 내에서 실행되는 특정한 것에 대한 위치이다. 

주의 RAW와 RVA는 같은 섹션내에 존재해야한다!!!!



Comments