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 |
---|