[모각코] 4주차 보고서(PE파일 HEADER(2))

semon·2023년 1월 29일
0

22-23_동계 모각코

목록 보기
5/7

1.IMAGE_NT_HEADERS

  • IMAGE_NT_HEADERS는 다음과 같이 WinNT.h에 있는 구조체이다.
  • IMAGE_NT_HEADERS 구조체는 32비트와 64비트용으로 나뉘며, OptionalHeader 필드에서 실질적인 차이가 나타난다.

1) DWORD Signature

  • signature 필드는 PE 파일 임을 나타내는 시그니처로, 4바이트로 구성되어 있고 항상 "PE\x0\x0" 값을 가진다. 또 앞에서 나온 e_lfanew 필드가 가르키는 오프셋 값에서부터 4바이트 값이며 WinNT.h에 다음과 같이 정의되어 있다.

    	#define IMAGE_NT_SIGNATURE	0x00004550	// PE00
  • 해당 필드의 값을 비교하기 위해서는 앞에서 구한 IMAGE_DOS_HEADER 구조체의 e_lfanew 필드가 가리키는 오프셋만큼 파일 포인터를 이동시키고 해당 지점에서 4바이트를 DWORD 형으로 읽어와서 위의 매크로와 비교하면 된다.

PBYTE pIter = GET_NT_HEADER(m_pImgView);
DWORD dwSig = *((PDWORD)pIter);
if (dwSig != IMAGE_NT_SIGNATURE)
	throw _T("PE 포맷을 가진 파일이 아닙니다.");

다음은 PEPlus 클래스에서 인라인 함수 정의를 통해 NT 시그니처를 체크하는 함수이다.

inline bool PEPlus::IsNTSignature(PBYTE pImgBase)
{
	PIMAGE_NT_HEADERS pnh = (PIMAGE_NT_HEADERS)GET_NT_HDRPTR(pImgBase);
    return (pnh->Signature == IMAGE_NT_SIGATURE);
}

2) IMAGE_FILE_HEADER

  • PE 시그니처 필드 다음에 있는 IMAGE_FILE_HEADER 구조체이다. 이 구조체의 크기는 20바이트로 IMAGE_SIZEOF_FILE_HEADER라는 매크로로 정의되어있다.

2.1 WORD Machine

  • PE 파일의 CPU ID를 나타내는 시그니처다. 다양한 CPU를 지원하지만 실제로 자주 쓰이는건 아래 3개가 대표적이다.
    • IMAGE_FILE_MACHINE_I386(0x014c) : 32비트 기반 인텔 x86 아키텍처
    • IMAGE_FILE_MACHINE_AMD64(0x8664) : 64비트 기반 AMD64 아키텍처
    • IMAGE_FILE_MACHINE_IA64(0x0200) : 64비트 기반 IA-64 아키텍처

2.2 WORD NumberOfSections

  • 본 PE 파일의 섹션 수를 나타낸다. .data, .rdata 등이 속한다.

2.3 DWORD TimeDateStamp

  • OBJ 파일이면 컴파일러, EXE나 DLL 같은 PE 파일이면 링커가 해당 파일을 만들어낸 시간을 의미하고 이 필드 값은 1970년 1월 1일 09시(GMT 시간 기준)부터 해당 파일을 만들어낸 시점까지의 시간을 초 단위로 나타낸다.

2.4 DWORD PointerToSymbolTable/DWORD NumberOfSymbols

  • PointerSymbolTable은 COFF(Common Object File Format) 심볼 테이블의 파일 오프셋을 나타낸다. NumberOfSymbols 필드는 PointerSymbolTable가 가리키는 COFF 심볼 테이블 내의 심볼 수를 나타낸다. 요즘에는 디버그 방식이 바뀌어 찾아보기 힘들다.

2.5 WORD SizeOfOptionalHeader

  • 해당 필드는 IMAGE_OPTIONAL_HEADER 구조체의 바이트 수를 나타낸다. OBJ 파일의 경우 0, PE 파일의 경우 sizeof(IMAGE_OPTIONAL_HEADER) 값을 가진다. 64비트 PE 파일의 경우 240(0xF0)바이트이며, 32비트의 경우 224(0xE0) 바이트다. 이 필드를 이용해서 IMAGE_DATA_DIRECTORY 구조체의 배열이나 IMAGE_SECTION_HEADER 테이블의 위치를 구할 수 있다.

2.6 WORD Characteristics

  • PE 파일에 대한 특정 정보를 나타내는 플래그로 다음과 같이 WinNT.h에 정의되어 있다.

3) IMAGE_OPTIONAL_HEADER

  • IMAGE_FILE_HEADER 다음으로 224바이트 또는 240바이트로 구성된 IMAGE_OPTIONAL_HEADER가 있다.
  • IMAGE_OPTIONAL_HEADER는 32비트와 64비트가 나눠지며 그 차이는 다음과 같다.
DWORD	BaseOfData;	// 64비트에서는 존재하지 않음

DWORD	SizeOfStackReserve;	// 64비트 -> ULONGLONG
DWORD	SizeOfStackCommit;	// 64비트 -> ULONGLONG
DWORD	SizeOfHeapReserve;	// 64비트 -> ULONGLONG        DWORD	SizeOfHeapCommit;	// 64비트 -> ULONGLONG        
profile
보안을 공부합니다

0개의 댓글