tmxklab
RVA to RAW 본문
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 |