PE 구조에서 빠질 수 없는 RVA RAW 변환에 대해 알아보자.

 

이러한 변환을 왜 하는가 하면,

파일을 실행했을 때 메모리에 로드된 주소가 파일의 Offset 과 다르게 로딩이 되기 때문이다.

 

자, 그럼 먼저 공식을 보자.

RAW = ( RVA – VA ) + PointerToRawData

RVA = ( RAW + VA ) – PointerToRawData

 

섹션헤더에 필요한 각각의 정보들이 들어있으며,

RVA 를 구하는건 RAW 구하는 공식을 거꾸로 한 것 뿐이다 .

 

그럼 XP환경에서 Notepad.exe 를 통해서 변환을 해보겠다.

 

먼저 Notepad.exe 의 섹션헤더에서 필요한 정보들을 찾아보자.

 

값이 리틀 엔디언으로 표기되어 있다 .

 

계산에 필요한 정보는 전부 나왔다 .

 

VA = 0x00001000

PointerToRawData = 0x00000400

 

그럼 RVA 9500 을 계산 해보자.

 

RAW = ( 9500 – 1000 ) + 400

RAW = 8900

( 복잡한 계산은 윈도우 계산기로 하는게 편하고 빠르다 ! )

 

 

맞는것 같은가?

여기서 우린 지나친 한가지가 있다 .

 

RVA 에 해당하는 섹션의 정보로 계산을 해야 한다는 것이다 .

 

RVA 9500 의 경우는 data 섹션영역에 해당하므로

 

섹션헤더 또한 data섹션헤더를 참조해야한다는 것이다.

 

 

data 섹션의 정보들이다.

 

VA = 0x00009000

PointerToRawData = 0x00007C00

 

자 그럼 다시 계산을 해보자.

 

RAW = ( 9500 – 9000 ) + 7C00

RAW = 8100

 

 

계산결과가 달라는걸 확인 할 수 있었다.

 

이처럼 해당 섹션영역에 헤더를 참조해야 하기 때문에

 

헤깔리지 않도록 주의하도록 하자 .

 

 

자, 그럼 실제로 실행된 상태의 주소와 파일 Offset 의 주소가

같은 데이터를 가리키는지 확인해보자 .

 

먼저 메모리에 매핑될때 NT헤더에서 이미지베이스에 기본적으로 로드가 된다.

 

Notepad.exe 의 경우 이미지 베이스는 0x01000000 이니 확인해보면

 

 

Dos 헤더의 시그네쳐값과 PE 값이 정상적으로 로딩되는걸 확인했다.

 

 

자, 그럼 실제로 INT 의 주소를 확인해보도록 하겠다 .

 

메모리에 로드된 상태의 INT 이며 , RVA 7990 을 가지고 있다.

 

RVA 7990 은 text 섹션영역에 해당하므로

text 섹션헤더를 참조하여 계산을 하도록 한다.

 

VA = 0x00001000

PointerToRawData = 0x00000400

 

RAW = ( 7990 – 1000 ) + 400

RAW = 6D90

 

자 그럼 파일 상태에서도 동일한 값을 가지나 확인해보자 .

 

완전 동일한 내용을 가지고 있는걸 확인 할 수 있다.

'Hacking > Reversing' 카테고리의 다른 글

PE 구조 ( PE 포맷 )  (0) 2015.10.12

+ Recent posts