리버싱 엔지니어링/리버싱 핵심 원리

13 PE File Format(3) - RVA to RAW

흰싸라기 2022. 3. 23. 16:27

 RVA to RAW 

: PE 파일이 메모리에 로딩되었을 때 각 섹션에서 메모리의 주소(RVA)와 파일 옵셋을 매핑

 

방법

1. RVA가 속한 섹션을 찾는다

2. 비례식을 통해 파일 옵셋을 계산한다

  • 비례식 : RAW = RVA - VirtualAddress + PointerToRawData
  • 파일 옵셋 = 섹션에서 메모리의 주소 - 메모리에서 섹션의 시작 주소 + 파일에서 섹션의 시작 주소

 

Quiz 

notepad.exe

Q2. RVA = 5000일 때 File Offset = ?

① RVA가 속한 섹션 : 첫 번째 섹션 (.text)

② 비례식 사용 (ImageBase 01000000 고려)

더보기
RAW = 5000(RVA) - 1000(VA) + 400(PointerToRawData) = 4400

 

Q2. RVA = 13314일 때 File Offset = ?

① RVA가 속한 섹션 : 세 번째 섹션 (.rsrc)

② 비례식 사용 

더보기
RAW = 13314 - B000 + 8400 = 10714

 

Q3. RVA = ABA8일 때 File Offset = ?

① RVA가 속한 섹션 : 두 번째 섹션(.data)

② 비례식 사용 :

더보기

RAW = ABA8 - 9000 + 7C00 = 97A8(?)

 

참고 ) 16진법 계산

더보기

알파벳은 아래와 같이 생각하여 계산

A 10
B 11
C 12
D 13
E 14
F 15

ABA8 - 9000 에서 16^4 자리를 10-9로 계산 => 1BA8

1BA8 + 7C00

  • 16^3 자리 : B+C = 23
    • 23 % 16 = 7. 따라서, 16^3 자리 값은 7
  • 16^4 자리 : 1+7+23/16= 1+7+1 = 9
    • 23/16은 16^3자리에서 올라온 것

(?)

더보기

97A8은 세 번째 섹션(.rsrc)에 속함 → (답) 해당 RVA에 대한 RAW 값을 정의할 수없다

  • 두 번째 섹션의 VirtualSize 값이 SizeOfRawData 값보다 크기 때문