ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PE File Format(2)
    Basic knowledge/리버싱(Reversing) 2019. 3. 25. 20:11

    1. RVA to RAW

    PE 파일이 메모리에 로딩 되었을때 각 섹션에서 메모리의 주소(RVA)와 파일 옵셋을 잘 매핑할 수 있어야 합니다. 

    이러한 방법을 RVA to RAW이라고 합니다.

    1. RVA가 속해있는섹션을 찾습니다.
    2. 간단한 비례식을 사용해서 파일 옵셋(RAV)을 계산합니다.

    IMAGE_SECTION_HEADER 구조체의 비례 식은 다음과 같습니다.

    RAW - PointerToRawData = RVA - VirtualAddress
                                     RAW = RVA - VirtualAddress + PointerToRawData

    Q1. RVA = 5000일때 File Offset = ?

    일단 RVA는 5000이므로 Section이 (".text")를 가리키고 있습니다.
    IMAGE_SECTION_HEADER 구조체 비례식에 의해서 
    RAW = 5000(RVA) - 1000(VirtualAddress) + 400(PointerToRawData) = 4400(".text")

    Q2. RVA = 13314 일때 File Offset = ?

    일단 RVA는 13314이므로 Section이 (".rsrc")를 가리키고 있습니다.
    RAW = 13314(RVA) - B000(VirtualAddress) + 8400(PointerToRawData) = 10714(".rsrc")

    Q3. RVA = ABA8일때 File Offset = ?

    일단 RVA는 ABA8이므로 Section이 (".data")를 가리키고 있습니다. 
    RAW = ABA8(RVA) - 9000(VirtualAddress) + 7C00(PointerToRawData) = 9748(".rsrc")

    이렇게 RVA의 섹션과 RAW의 섹션의 위치가 다르기 때문에
    해당 RVA(ABA8)에 대한 RAW값은 정의할 수 없다. 라고 이야기 합니다.

    2. IAT

    PE를 처음 배울때 최고의 난관은 IAT(Import Address Table)입니다.
    IAT 에는 process, memory, DLL 구조 등의 내용이 함축되어 있기때문에 처음에는 많이 어려워 합니다.

    IAT를 쉽게 이야기 하자면, 프로그램이 어떤 라이브러리에서 어떤 함수를 사용하고 있는지를 기술한 테이블 입니다.

    2-1. IAT - DLL

    DLL은 Dynamic Linked Library의 약자로 우리말로 동적 연결 라이브러리 라고 합니다.

    DLL에는 DLL 개념이라는 것이 있는데 다음과 같습니다.
    •  프로그램에 라이브러리를 포함 시키지 말고 별도의 파일(DLL)로 구성하여 필요할때 마다 호출하자.
    • 일단 한번 로딩된 DLL의 코드, 리소스는 Memory Mapping 기술로 여러 Process에서 공유해서 사용하자.
    • 라이 브러리가 업데이트 되었을때 해당 DLL 파일만 교체하면 되니 쉽고 편해서 좋다.

    실제 DLL 로딩 방식은 2가지 인데
    프로그램에서 사용되는 순간에 로딩이 되고 사용이 끝나면 자동으로 메모리 해제가 되는 방법인 Explicit Linking 방식
    프로그램 시작할때 같이 로딩되어서 사용되고 프로그램이 종료 할때 메모리 해제가 되는 방법인 Implicit Linking 방식이 있습니다.

    IAT에서는 후자의 방식인 Implicit Linking 방식을 사용합니다. 

    2-2. IAT - IMAGE_IMPORT_DESCRIPTOR

    PE파일은 어떤 라이브러리를 IMPORT하고 있는지 IMAGE_IMPORT_DESCRIPTOR 구조체에 명시하고 있습니다.


    IMAGE_IMPORT_DESCRIPTOR 구조체에서 중요한 멤버는 다음과 같습니다.


    항목
    의미
    OringinalFirstThunk
    INT의 주소(RVA)
    Name
    Library 이름 문자열 의 주소(RVA)
    FirstThunk
    IAT의 주소(RVA)

    3. EAT

    EAT는 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할 수 있도록 해주는 핵심 메커니즘 입니다. 

    3-2. IAT - IMAGE_IMPORT_DIRECTORY

    IMAGE_IMPORT_DIRECTORY 구조체는 다음과 같습니다.


    위의 구조체에서 중요한 멤버는 다음과 같습니다.

    항목
    의미
    NumberOfFunctions
    실제 Export 함수 개수
    NumberOfName
    Export 함수중에서 이름을 가지는 함수 개수
    AddressOfFunctions
    Export 함수 주소 배열
    AddressOfNames
    함수 이름 주소 배열
    AddressOfNameOrdinals
    Ordinal 배열



    'Basic knowledge > 리버싱(Reversing)' 카테고리의 다른 글

    ASPACK Unpacking  (0) 2019.05.06
    PE File Format(1)  (0) 2019.03.25

    댓글

Designed by Tistory.