티스토리 뷰

PE에서의 VA(Virtual Address), RVA(Relative Virtual Address), RAW(File Offset)

PE(Windows)말고, Linux에서도 마찬가지이지만, 각각의 응용 프로그램들은 실행되고 나면 서로 공유되지 않은 메모리 주소를 사용할 수 있다.


0x00000000 ~ 0xFFFFFFFFF 의 공간을 각자의 프로그램들이 자신의 것처럼 사용할 수 있게 된다.

다시 말해, 모든 프로세스는 자신만의 가상 주소 공간을 가지고 있고,

32비트 프로세스는 최대 4GB(메모리 포인터 - 4바이트) / 64비트 프로세스는 최대 16EB(메모리 포인터  - 8바이트)의 메모리 공간을 가질 수 있다.

이러한 기술을 "가상 메모리 기법" 이라고 하는데, 이는 나중에 따로 설명하고, 여기서는 VA, RVA, RAW에 대해서만 설명하도록 한다.



VM은 Virtual Memory 의 약자로, Virtual Machine의 축약어와는 다른 용어이다.


1. VA(Virtual Address)

프로세스 메모리인 VM(Virtual Memory)의 절대 주소를 나태낸다. ex) 0x4000FFFF 와 같은 메모리 주소.


2. RVA(Relative Virtual Address)

기준위치 (ImageBase - Virtual Address로 저장됨)과의 상대 주소를 나타낸다.

앞으로 PE의 DataDirectory 와 Section header 나올 메모리 주소(FileOffsetPointer)들은 전부다 RVA 이다.


이렇게 VA와 같은 절대 주소를 쓰지 않고 ImageBase와의 상대 주소를 쓰는 이유는, 프로그램이 메모리로 옮겨져 실행될 때,

반드시 ImageBase메모리에 프로그램이 적제되지 않고, 경우에 따라 이 ImageBase가 변경되어 다른 메모리 주소에 적제될 수 있기 때문에다. (또는 ASLR)

이러한 상황이 발생할 경우, PE Loader는 변경된 ImageBase + RVA를 통해 적제되는 메모리 주소가 변경되어도, 프로그램을 정상적으로 메모리로 옮길 수 있고,

실행을 가능하게 한다.


+ 다음과 같은 공식이 성립한다.

VA = ImageBase + RVA

RVA = VA - ImageBase


3. FILE OFFSET

메모리에 올라가있지 않은, 하드 디스크에 저장된 PE 파일에서 특정한 헤더나 섹션의 시작 지점이 파일의 어느 위치에 알려준다.

Section Header에서 해당 섹션의 코드가 시작되는 부분을 File Offset으로 저장해, PE Loader가 프로그램을 적제하기 시작할 때 이 위치에서 코드를 찾아 메모리에 로드하게 된다.


참고:

http://egloos.zum.com/sweeper/v/2988689


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함