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
RAW는 disk상의 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의 RVA는 0x00003064 입니다.
RAW = 0x00003064 - VirtualAddress + PointerToRawData
VirtualAddress는 RVA가 속해있는 section의 RVA 입니다.
0x00003064는 .idata section에 속해있습니다.
.idata section의 RVA는 0x00003000 입니다.
RAW = 0x00003064 - 0x00003000 + PointerToRawData
PointerToRawData는 RVA가 속해있는 section의 offset 입니다.
.idata section의 offset은 0x00000A00 입니다.
RAW = 0x00003064 - 0x00003000 + 0x00000A00
계산하면 RAW는 0x00000A64 입니다.
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 |