ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PE 파일 구조 (3) - PE 헤더(NT Header)
    IT/리버싱 핵심원리 2017. 11. 29. 16:28

    공부를 시작하기에 앞서 본 글은 '리버싱핵심원리', 이승원 저자, 인사이트 를 참고했음을 밝힙니다.

    또한 공부하는 입장에서 정리를 목적으로 작성하였기때문에 틀린 정보가 있을수도 있다는 것을 알려드립니다.


    관련 글

    PE 파일 구조 (1) - PE 기본구조, VA & RVA

    PE 파일 구조 (2) - PE 헤더(DOS Header, DOS Stub)

    PE 파일 구조 (3) - PE 헤더(NT Header)


    계속해서 PE 헤더에 대해서 알아보도록 하겠습니다.


    NT Header


    NT Header 구조체 IMAGE_NT_HEADERS입니다.


    IMAGE_NT_HEADERS 구조체


    typedef struct _IMAGE_NT_HEADERS {

          DWORD Signature;

          IMAGE_FILE_HEADER FileHeader;

          IMAGE_OPTIONAL_HEADER32 OptionalHeader;

    } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

    출처 : Microsoft Platform SDK - winnt.h


    IMAGE_NT_HEADERS 구조체는 3개의 멤버로 이루어져 있다.

    메모장(notepad.exe) 파일의 구조를 살펴보겠다.



    첫번째 멤버인 Signature는 50450000 으로 PE 값을 가집니다.

    그 다음 멤버인 FileHeader와 OptionalHeader 구조체는 조금더 자세히 알아보도록 하겠습니다.


    NT Header - File Header


    IMAGE_FILE_HEADER 구조체 입니다.


    IMAGE_FILE_HEADER 구조체


    typedef struct _IMAGE_FILE_HEADER {

          WORD   Machine;

          WORD   NumberOfSections;

          DWORD TimeDateStamp;

          DWORD PointerToSymbolTable;

          DWORD NumberOfSymbols;

          WORD   SizeOfOptionalHeader;

          WORD   Characteristics;

    } IMAGE_NT_HEADER, *PIMAGE_NT_HEADER;

    출처 : Microsoft Platform SDK - winnt.h


    IMAGE_FILE_HEADER 구조체에서 4가지 멤버가 가장 중요하다.


    1. Machine

    Machine 넘버는 CPU별로 고유한 값이다. 32비트 Intel x86 호환 칩은 14C의 값을 가진다. winnt.h 파일에 정의된 Machine 넘버 값들이 있다.


    Machine 넘버



    출처 : Microsoft Platform SDK - winnt.h


    메모장(notepad.exe) 파일의 구조를 살펴보겠다.

    아래 표시된 부분이 Machine의 값이다. 전에도 이야기했듯이 Little Endian 방식으로 읽기때문에 '4C01' 이 아닌 '014C' 로 읽는다. 위의 Machine 값을 참조해보면 014C는 Intel 386을 의미한다.




    2. NumberOfSections

    코드, 데이터, 리소스 등이 각각의 섹션에 나뉘어서 저장되는데 그 섹션의 개수를 나타내는 멤버이다. 이 값은 반드시 0보다 커야하며, 정의된 섹션 개수와 실제 색션이 다르면 실행 에러가 발생한다.


    메모장(notepad.exe) 파일의 구조를 살펴보겠다.

    마찬가지로 Little Endian 방식으로 읽어 0003 이 된다. 즉, 섹션의 개수는 3개이며 PEview를 통해 확인해보면 '.text', '.data', '.rsrc'의 섹션이 존재하는 것을 확인할 수 있다. 



    3. SizeOfOptionalHeader

    IMAGE_NT_HEADERS 구조체의 마지막 멤버는 IMAGE_OPTIONAL_HEADER32 구조체이다. SIzeOfOptionalHeader 멤버는 이 IMAGE_OPTIONAL_HEADER32 구조체의 크기를 나타낸다.


    메모장(notepad.exe) 파일의 구조를 살펴보겠다.

    SizeOfOptionalHeader의 값은 00E0 로 IMAGE_OPTIONAL_HEADER32 구조체의 크기는 0xE0 이다.



    4. Characteristics

    파일의 속성을 나타내는 값이다. 속성의 값을 bit OR 형식으로 조합하여 나타낸다.

    아래는 Characteristics 값들이다.


    Characteristics


    출처 : Microsoft Platform SDK - winnt.h


    메모장(notepad.exe) 파일의 구조를 살펴보겠다.

    Characteristics의 값이 010F 이다. 즉, 위의 속성의 값들을 bit OR했을 때 0x010F 가 나오면 되는 것이다. 이를 풀어보면 32BIT_MACHINE에 LOCAL_SYMS_STRIPPED, LINE_NUMS_STRIPPED, EXECUTABLE_IMAGE, RELOCS_STRIPPED 속성을 가지는 프로그램임을 알 수 있다.



    다음 포스팅에서는 NT Header의 Optional Header에 대해서 알아보도록 하겠습니다.





    댓글

Designed by Tistory.