Reversing/PE File Format2012. 11. 12. 17:39

RVA & RAW



0x01. RVA (Relative Virtual Address)


VA (Virtual Address)memory에 mapping된 절대 주소를 뜻합니다.

RVA는 이름 그대로 어느 기준(ImageBase)으로부터의 상대 주소를 뜻합니다.


VA와 RVA의 관계는 다음과 같습니다.

RVA + ImageBase = VA


PE header 내의 많은 정보들이 RVA 형태로 되어있습니다.

RVA를 사용하는 이유는 relocation 때문입니다.

Dll 같은 경우 memory에 mapping하려는 주소에 이미 다른 library가 있는 경우

Relocation을 통해 빈 공간에 mapping하게 됩니다.


0x02. RAW


RAWdisk상의 file에서 주소를 뜻합니다.

File상에서의 offset이라고도 부릅니다.


0x03. RVA to RAW


PE file이 memory에 load 될 때 RVA와 offset을 mapping할 수 있습니다.

RVA를 통해 offset을 구할 때 사용하는 비례식과 값들은 다음과 같습니다.


RAW - PointerToRawData = RVA - VirtualAddress

RAW = RVA - VirtualAddress + PointerToRawData


RAW : File 상에서의 offset

RVA : Memory 상에서의 RVA

VirtualAddress : Offset을 찾으려는 RVA가 속해있는 section의 RVA

PointerToRawData : Offset을 찾으려는 RVA가 속해있는 section의 offset


0x04. Practice


PEview를 이용해 직접 offset과 RVA를 변환 해 보겠습니다.

PEview로 열어볼 파일은 reversing 입문자 용 문제인 abex' crackme 1 입니다.


해당 프로그램에서 load 하는 dll중 하나인

KERNEL32.dll의 이름을 가리키고 있는 RVA를 offset으로 변환하겠습니다.


계산식을 하나씩 채워나가도록 하겠습니다.

RAW = RVA - VirtualAddress + PointerToRawData


RVA는 offset을 찾으려는 값을 넣으면 됩니다.

KERNEL32.dll의 RVA0x00003064 입니다.


RAW = 0x00003064 - VirtualAddress + PointerToRawData


VirtualAddress는 RVA가 속해있는 section의 RVA 입니다.

0x00003064는 .idata section에 속해있습니다.

.idata section의 RVA0x00003000 입니다.


RAW = 0x00003064 - 0x00003000 + PointerToRawData


PointerToRawData는 RVA가 속해있는 section의 offset 입니다.

.idata section의 offset0x00000A00 입니다.


RAW = 0x00003064 - 0x00003000 + 0x00000A00


계산하면 RAW0x00000A64 입니다.

Disk 상에서 0x00000A64를 찾아가봅니다.


KERNEL32.dll string이 있는 것을 확인할 수 있습니다.


'Reversing > PE File Format' 카테고리의 다른 글

PE File Format 0x06  (0) 2012.11.11
PE File Format 0x05  (0) 2012.11.07
PE File Format 0x04  (0) 2012.10.31
PE File Format 0x03  (0) 2012.10.29
PE File Format 0x02  (0) 2012.10.29
Posted by slimV