ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0x02.PE header(2)
    0x.리버스 엔지니어링/PE File Format 2017. 8. 7. 12:17

    0x02.PE header(2)



    저번 포스팅에 이어서 설명하겠다.



    4. Section header


    각 섹션이 갖는 속성을 정의하는 것이 섹션 헤더인데, 메모장 같은 경우, text, data, rsrc라는 섹션이 있기에 그에 해당되는 3개의 섹션 헤더가 존재한다. 섹션이 3가지로 나뉘어지는 까닭은 안정성을 위해서인데 그 예로 버퍼 오버플로우를 들 수 있다.


    섹션 헤더는 구조체의 배열 형태로 되어 있는데 아래와 같다.


    #define IMAGE_SIZEOF_SHORT_NAME


    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;


    간단히 멤버를 살펴보면 VirtualSize는 메모리에서의 섹션의 크기를 나타내고 VirtualAddress가 섹션의 시작 주소이다. SizeOfRawData는 파일에서 섹션이 차지하는 크기를, PointerToRawData는 파일에서 섹션의 시작 위치를 나타낸다. 마지막 멤버인 Characteristics는 섹션의 속성을 나타낸다. 참고로 VirtualSize의 값과 SizeOfRawData의 값은 다른데, 이는 파일에서의 섹션 크기와 메모리에 로딩된 섹션 크기가 다르기 때문이다.



    헥스 코드를 보면 text, data, rsrc 섹션에 대한 정보가 차례대로 저장되어 있음을 알 수 있다.



    ★ RAW to RVA


    파일에서의 주소와 메모리에서의 주소는 다르다. PE 파일이 메모리에 로딩되었을 때의 offset을 계산할 줄 알아야 하기에 방법을 적는다.


    RAW = RVA - VirtualAddress + PointerToRawData




    아래는 간단한 예제이다.





    1) RVA=90000, File Offset??

    RAV 90000은 Section(".text")에 속해있다. 식을 적용해보면,


    RAW = 90000 - 1000 + 400 = 89600



    2) RVA = 106000, File Offest??


    RAW = 106000 - 1ACFC + 1B600 = 108308




     

    '0x.리버스 엔지니어링 > PE File Format' 카테고리의 다른 글

    0x01.PE header  (0) 2017.08.04
    0x00.PE File Format  (0) 2017.08.03

    댓글

Designed by Tistory.