ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PE 구조 (6) - 계산기의 PE 구조 / SECTION Header
    Knowledge/Reversing 2019. 9. 26. 13:07

     

     

     

    오늘은 계산기의 SECTION HEADER 구조에 대해서 공부할 차례이다.

    이번 챕터를 지나고 나면 저번글에서 언급하지 못했던 Image data directory를 볼 것이다.

     

     

    우선 섹션 해더의 구조를 살펴보자.


    #define IMAGE_SIZEOF_SHORT_NAME              8

    typedef struct _IMAGE_SECTION_HEADER {
        BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
        union {
                DWORD   PhysicalAddress;
                DWORD   VirtualSize;
        } Misc;
        DWORD   VirtualAddress;
        DWORD   SizeOfRawData;
        DWORD   PointerToRawData;
        DWORD   PointerToRelocations;
        DWORD   PointerToLinenumbers;
        WORD    NumberOfRelocations;
        WORD    NumberOfLinenumbers;
        DWORD   Characteristics;
    } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

    #define IMAGE_SIZEOF_SECTION_HEADER          40

     

    섹션 헤더의 사이즈는 40이라고 적혀있다.

    사실인지 직접 계산해서 확인해보자.

     

    1 * 8 + 2 * 2 + 4 * 7 = 40

    네. 그렇습니다... 크흠

     

     

    우리가 주로 봐야할 변수들을 확인해보면

     

    Name[8] : ex) .text
    VirtualSize : 메모리 상에서 차지하는 크기
    ViratualAddress : 메모리 상에서 섹션의 시작 주소(RVA)
    SizeOfRawData : 파일 상에서의 section이 차지하는 크기
    PointerToRawData : 파일 상에서의 section의 시작 위치
    Charicteristics : 섹션의 속성

     

    섹션 헤더가 3개 존재한다는 것을 이전 글을 통해서 확인한 바가 있다.

     

    https://shineild-security.tistory.com/72?category=1047174

     

    PE 구조 (3) - 계산기의 PE 구조 / PE offset 확인하는 법

    안녕하세요. 오랜만에 PE 구조 관련글을 다시 적게 되었습니다. 요즘 자격증 공부로 바빠서 하지 못했던 개인 공부들을 다시 시작하며 밀렸던 글들을 적어나가려고 한다. 인터넷에는 대부분 32bit notepad로 PE구..

    shineild-security.tistory.com

     

     

    winhex를 통해서 각각의 섹션 헤더값들을 확인해 보자.

     

     

    첫번째 SECTION HEADER

     

     

     

     

    NAME[8] : 2E 74 65 78 74 (.text)

    딱히 설명할 필요가 사실 없는 부분이다.

    이 섹션의 이름은 .text라는 것을 알려준다.

     

     

    VirtualSize : B0 26 01 ( 126B0)

    디버거를 통해서 확인 한 섹션이 실제 메모리에 할당된 사이즈가 126B0이라는 뜻이다.

     

     

    VirtualAddress : 00 10 ( 1000)

    메모리 상에서 시작하는 주소이다. 보통 RVA라고 말한다.

    이제 이 RVA를 이용해서 RAW와 함께 변환공식을 사용해서 각종 위치값들을 구할 수 있다.

    추후에 data directiory에서 사용해보도록 하자.

     

    SizeOfRawData : 00 28 01 (12800)

    VirtualSize와 대비되는 녀석으로 파일 offset 상에서 나타나는 Section의 크기를 나타낸다.

    VirtualSize 126B0과 크게 다르지 않은 값을 갖고 있다.

     

     

    PointerToRawData : 00 04 (400)

    파일 상에서 Section이 시작하는 offset 값을 나타낸다.

    이 부분은 우리가 winhex를 통해서 바로 알 수 있다.

    확인해보자.

     

     

     

     

    400에서 첫번째 섹션이 시작되는 것을 확인 할 수 있었다.

    이왕 조사하는거 크기도 맞는지 확인해보자.

    12800 + 400 = 12C00

     

    음.. 맞는 것 같다!

     

     

    Charicteristics : 20 00 00 60 (60000020)

    0110 0000 0000 0000 0000 0000 0010 0000

     

    정의된 속성 값을 확인해보자.

     

    //
    // Section characteristics.
    //
    //      IMAGE_SCN_TYPE_REG                   0x00000000  // Reserved.
    //      IMAGE_SCN_TYPE_DSECT                 0x00000001  // Reserved.
    //      IMAGE_SCN_TYPE_NOLOAD                0x00000002  // Reserved.
    //      IMAGE_SCN_TYPE_GROUP                 0x00000004  // Reserved.
    #define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.
    //      IMAGE_SCN_TYPE_COPY                  0x00000010  // Reserved.

    #define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.
    #define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.
    #define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.

    #define IMAGE_SCN_LNK_OTHER                  0x00000100  // Reserved.
    #define IMAGE_SCN_LNK_INFO                   0x00000200  // Section contains comments or some other type of information.
    //      IMAGE_SCN_TYPE_OVER                  0x00000400  // Reserved.
    #define IMAGE_SCN_LNK_REMOVE                 0x00000800  // Section contents will not become part of image.
    #define IMAGE_SCN_LNK_COMDAT                 0x00001000  // Section contents comdat.
    //                                           0x00002000  // Reserved.
    //      IMAGE_SCN_MEM_PROTECTED - Obsolete   0x00004000
    #define IMAGE_SCN_NO_DEFER_SPEC_EXC          0x00004000  // Reset speculative exceptions handling bits in the TLB entries for this section.
    #define IMAGE_SCN_GPREL                      0x00008000  // Section content can be accessed relative to GP
    #define IMAGE_SCN_MEM_FARDATA                0x00008000
    //      IMAGE_SCN_MEM_SYSHEAP  - Obsolete    0x00010000
    #define IMAGE_SCN_MEM_PURGEABLE              0x00020000
    #define IMAGE_SCN_MEM_16BIT                  0x00020000
    #define IMAGE_SCN_MEM_LOCKED                 0x00040000
    #define IMAGE_SCN_MEM_PRELOAD                0x00080000

    #define IMAGE_SCN_ALIGN_1BYTES               0x00100000  //
    #define IMAGE_SCN_ALIGN_2BYTES               0x00200000  //
    #define IMAGE_SCN_ALIGN_4BYTES               0x00300000  //
    #define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //
    #define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.
    #define IMAGE_SCN_ALIGN_32BYTES              0x00600000  //
    #define IMAGE_SCN_ALIGN_64BYTES              0x00700000  //
    #define IMAGE_SCN_ALIGN_128BYTES             0x00800000  //
    #define IMAGE_SCN_ALIGN_256BYTES             0x00900000  //
    #define IMAGE_SCN_ALIGN_512BYTES             0x00A00000  //
    #define IMAGE_SCN_ALIGN_1024BYTES            0x00B00000  //
    #define IMAGE_SCN_ALIGN_2048BYTES            0x00C00000  //
    #define IMAGE_SCN_ALIGN_4096BYTES            0x00D00000  //
    #define IMAGE_SCN_ALIGN_8192BYTES            0x00E00000  //
    // Unused                                    0x00F00000
    #define IMAGE_SCN_ALIGN_MASK                 0x00F00000

    #define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000  // Section contains extended relocations.
    #define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.
    #define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.
    #define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.
    #define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.
    #define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.
    #define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
    #define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.

     

     

    아뉘 뭐가 이리 많은거지

    #define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.

    #define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.

     

    exe 파일이라는 것과 섹션에 코드가 포함되어 있다? 라는 의미 같다..............흑

     

     

     

     

    이제 3개 중 1개가 끝났다. ㅎㅎ;;;

     

     

    이제 다음 섹션 헤더를 살펴보자!

    이제는 빠르게 확인만 하겠다.

     

    두번째 SECTION HEADER

    2번째 section header

     

    NAME[8] : 2E 64 61 74 61 (.data)

     

    VirtualSize : 1C 10 (101C)

     

    VirtualAddress : 00 40 01 ( 14000)

     

    SizeOfRawData : 00 0A (A00)

     

    PointerToRawData : 00 2C 01 (12C00)

    아까 .text가 12C00에서 끝나는 걸 알아봤다.

    저번 사진에서 보면 두번째 섹션이 12C00이다는 것을 확인했었다.

     

    12C00 + A00 = 13600

     

    정확히 두번째 섹션이 끝나고 세번째 섹션이 시작되는 것을 확인 할 수가 있었다.

     

     

     

    Charicteristics : 40 00 00 C0 (C0000040)

    #define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.

    #define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
    #define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.

     

    이 섹션에는 data가 담겨있고 읽을 수 있고 쓸 수 있다고 말하고 있다.

     

     

     

    세번째 SECTION

     

    세번째 section heaeder

    NAME[8] : 2E 72 73 72 63 (.rsrc)

     

    VirtualSize : 60 89 (8960)

     

    VirtualAddress : 00 60 01 (16000)

     

    SizeOfRawData : 00 8A (8A00)

     

    PointerToRawData : 00 36 01 (13600)

    두번째 섹션의 크기를 확인하면서 보았던 부분이다.

    그럼으로 sizeofrawdata가 맞는지만 확인해보자.

    1C000에 PE가 끝나는지 보면 될것이다.

     

     

    사실 저번에도 확인했던 부분으로 긴말 없이 넘어가겠다.

     

     

    Charicteristics : 40 00 00 40

    #define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.

    #define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.

     

     

    이로써 calc.exe의 section header에 대해서 다 알아보았다.

    다음은 아마 rva와 raw 계산식 관련 글이 될 것이다.

    댓글

Designed by Tistory.