본문 바로가기

REVERSING

[SWING] Reversing 04

 

과제 1

 

RVA to RAW란 PE File이 메모리에 로딩되었을 때, 각 Section에서 16진수의 Memory 주소(RVA)와 File Offset을 매핑(Mapping)하는 과정이다. 여기서 RAW는 File Offset을 의미한다.

 

기본적인 방법은 다음과 같다.

 

1. RVA가 속해 있는 section을 찾는다.
2. 다음의 비례식을 이용해서 RAW(File Offset)을 계산한다.

 

RAW - PointerToRawData = RVA - VirtualAddress

RAW = RVA - VirtualAddress + PointerToRawData

 

 

 

Q2. RVA = 13314일 때 FILE OFFSET = ?

RVA = 13314 이므로 ImageBase(01000000)을 고려해 계산해보면 VA (*VirtualAddress와 다르다*) = RVA + ImageBase = 01013314가 되기 때문에 해당 Address는 Section (.rsrc)에 존재함을 알 수 있다. 고로 위의 식에 값들을 대입해보면 다음과 같다. RAW = 13314(RVA) - B000(VirtualAddress) + 8400(PointerToRawData) = 10174 이다.

VirtualAddress가 B000인 이유는 Memory에서 세 번째 Section이 0100B000에서 시작하므로 B000이다.

(ImageBase 값을 빼면) PointerToRawData 값이 8400인 이유는 File에서 세 번째 Section이 00008400에서 시작하기 때문이다.

 

13314는 rsrc Section에 해당하며 해당 섹션의 Virtual Address는 9000이므로

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

 

Q3. RVA = ABA8일 때 FILE OFFSET = ?

RVA = ABA8 이므로 해당 Address는 0100ABA8 이라서 Section (.data)에 존재함을 알 수 있다. 위의 식에 값을 대입해보면 RAW = ABA8(RVA) - 9000(VirtualAddress) + 7C00(PointerToRawData) = 97A8 이다.

VirtualAddress가 9000인 이유는 Memory에서 두 번째 Section이 01009000에서 시작하므로 9000이다.

(ImageBase 값을 빼면) PointerToRawData 값이 7C00인 이유는 File에서 두 번째 Section이 00007C00에서 시작하기 때문이다.

 

RAW의 결과는 97A8인데 이는 File Offset에서 볼 때 Section (.rsrc)에 속해있다.

RVA는 Section (.data) 인데 RAW는 Section (.rsrc) 이라는 것은 말이 안되므로 "해당 RVA(ABA8)에 대한 RAW 값은 정의할 수 없다." 라고 해야한다.

이런 결과가 나온 이유는 Section (.data)의 VirtualSize의 값이 SizeOfRawData 값보다 크기 때문이다.

 

 

 

'REVERSING' 카테고리의 다른 글

[SWING] Reversing 06  (0) 2023.03.26
[SWING] Reversing 05  (0) 2022.08.26
[SWING] Reversing 03  (0) 2022.08.13
[SWING] Reversing 02  (0) 2022.08.06
[SWING] Reversing 01  (0) 2022.07.30