tmxklab

RVA to RAW 본문

Security/02 Reversing

RVA to RAW

tmxk4221 2021. 8. 4. 13:40

PE파일이 메모리에 로딩되었을 때 각 섹션에서 메모리의 주소(RVA)와 파일 옵셋을 잘 매핑해야 하는데 이러한 매핑을 'RVA to RAW'라고 부른다.

 

먼저 섹션 헤더의 구조체인 IMAGE_SECTION_HEADER에서 주요 멤버를 살펴보자

  • VirutalSize : 메모리에서 섹션이 차지하는 크기
  • VirutalAddress : 메모리에서 섹션의 시작 주소(RVA)
  • SizeOfRawData : 파일에서 섹션이 차지하는 크기
  • PointerToRawData : 파일에서 섹션의 시작 위치

 

[ Process ] 

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

2) 간단한 비례식을 사용해서 파일 옵셋(RAW)을 계산

 

[ 비례식 ]

RAW - PointerToRawData = RVA - VirtualAddress

RAW = RVA - VirtualAddress + PointerToRawData

RVA = RAW - PointerToRawData + VirtualAddress

 

즉, 위의 간단한 비례식을 통해서 RAW(File에서 offset), RVA(Memory 주소)을 구할 수 있다.

 

문제 1) RVA = 0x6000일 때, File Offset(RAW)값은?

① Memory상에서 RVA값이 0x6000에 해당하는 섹션을 찾아본다.

  • 이 때, ImageBaseAddress가 0x1000000인 것을 고려하자
  • 그러면, 0x1006000이 포함된 섹션은 Section(".text")인 것을 확인할 수 있다.

② 비례식을 사용한다.

  • RVA : 0x6000
  • VirtualAddress : 0x1000 (VirtualAddress라서 헷갈렸는데 text Section의 RVA값임)
  • PointerToRawData : 0x400 (파일 상에서 .text섹션의 offset)

비례식:

RAW = 0x6000 - 0x1000 + 0x400 = 0x5400

 

문제 2) RVA = 0xABA8일 때, File Offset(RAW)값은?

① Memory상에서 RVA값이 0xABA8에 해당하는 섹션을 찾아본다.

  • 0x100ABA8을 포함하는 섹션은 Section(".data")인 것을 확인할 수 있다.

② 비례식을 사용한다.

  • RVA : 0xABA8
  • VirtualAddress : 0x9000
  • PointerToRawData : 0x7C00

비례식:

RAW = 0xABA8 - 0x9000 + 0x7C00 = 0x97A8(?)

 

결과가 이상한 것을 눈치챘을 수 있다. RVA값은 0xABA8일 때, 메모리 상에서 Section(".data")에 해당되는데

RAW값이 0x97A8이므로 파일 상에서 Section(".rsrc")에 해당한다.

이는 Section(".data")의 VirtualSize값이 SizeOfRawData값 보다 크기 때문에 발생한다.

 

참고로 이렇게 VirtualSize값이 SizeOfRawData보다 큰 경우에 나머지 섹션에는 0으로 채워진다.

 

'Security > 02 Reversing' 카테고리의 다른 글

EAT(Export Address Table)  (0) 2021.08.06
IAT(Import Address Table)  (0) 2021.08.04
Window API 관련  (0) 2021.04.18
ARM Assembly 정리 (기초)  (0) 2020.12.18
[리버싱] 어셈블리어 설명 및 종류  (0) 2020.02.03
Comments