evans 2018. 1. 18. 12:21

섹션 헤더를 잘 이해했다면 이제 PE 파일이 메모리에 로딩되었을 때 각 섹션에서 메모리의 주소(RVA)와 파일 옵셋을 잘 매핑할 수 있어야 합니다. 이러한 매핑을 일반적으로 'RVA to RAW'라고 부른다. 방법은 아래와 같다.


1. RVA가 속해있는 섹션을 찾는다.

2. 간단한 식을 사용해서 파일 옵셋(RAW)를 구한다.


RAW - PinterToRawData = RVA - VirtualAddress

                     RAW     = RVA- VritualAddress + PointerToRawData


하나씩 살펴보면 RVA는 각 섹션에서 메모리 주소.

     VirtualAddress는  메모리에서 섹션의 시작주소

     PointToRawData는 file에서 섹션의 시작주소.

     RAW는 각 섹션에서 파일주소 이렇게 보고 다음 예저를 살펴보자




Q1)  RVA = 5000 일때 File Offset = ?

A1) 먼저 해당 RVA 값이 속해 있는 섹션을 찾아야 한다.(메모리 영역 기준)

      => RVA 5000는 첫번째 섹션(".text")에 속해있다. (ImageBase 01000000이니 메모리 주소에서 01000000 를 뺀 값을 보면 된다.)

      => RAW = 5000(RVA) - 1000(VirtualAddress) + 400(PointerToRawData) = 4400


Q2) RVA = 13314 일때 File Offset = ?

A2) 해당 RVA 값이 속해 있는 섹션을 찾는다.

      => 세번째 섹션(".rsrc")에 속해있다.

      => RAW = 13314(RVA) - B000(VA) + 8400(PointerToRawData) = 10714


Q3) RVA = ABA8 일때 File Offset = ?

A2) 해당 RVA 값이 속해 있는 섹션을 찾는다.

      => 두번째 섹션(".data")에 속해있다.

=> RAW = ABA8(RVA) - 9000(VA) + 7C00(PointerToRawData) = 97A8(?)


값이 97A8이 나왔는데 이 옵셋은 세번째 섹션(.rsrc)에 속해 있다. RVA는 두번째 섹션이고 RAW는 세번째 섹션이라는건 말이 되지 않는다. 이 경우에는 해당 RVA에 대한 RAW는 정의 할 수 없다고 해야한다. 이러한 결과가 나오는 이유는 위 경우에 두번째 섹션의 VirtualSize값이 SizeOfRawData값보다 크기 때문이다.