2. Raw Data와 메모리 주소의 Mapping

Ghidra를 설치하고 파일 불러오는 정도의 기본적인 기능은 이미 다른 곳에서 많이 다뤘으니 (예를 들어, https://go-madhat.github.io/Introduce-to-Ghidra/) 이에 대한 설명은 생략하고 단도직입적으로 CodeBrowser 화면을 살펴봅시다. (랑그릿사2의 실행파일인 langpc2.exe를 import 해서 analyze 한 결과입니다.)



작은 창이 여러 개 있는데, 어떤 창을 볼지는 [메뉴 > Window] 에서 선택할 수 있습니다. 참고로, 위 화면의 경우 Program Trees, Symbol Tree, Listing: langpc2.exe 을 선택한 것입니다.

Program Trees 창에서 Headers를 클릭하면 Listing: langpc2.exe 창에 프로그램의 헤더 정보가 나타납니다.
이 중에서 중요한 정보는 PointerToRawData라고 나타난 부분이며 Raw Data의 위치를 다음과 같이 알 수 있습니다.
Name
PointerToRawData
.text
00_00_04_00
.rdata
00_03_E4_00
.data
00_03_EE_00
.idata
00_04_A2_00
.rsrc
00_04_AE_00

여기서 16진수 숫자는 0x3E400 처럼 앞에 0x를 붙이거나 00_03_E4_00과 같이 _ 를 중간에 넣어서 10진수 숫자와 구분하도록 하겠습니다.
예를 들어 .rsrc의 크기는 0x400 (10진수로 1024) 입니다.

그리고 [메뉴 > Memory Map] 을 선택하면 다음과 같이 메모리 주소를 알 수 있습니다.


 
Name
Memory Address
Raw Data
Start
End
Start
End
.text
00_40_10_00
00_43_EE_B4
00_00_04_00
00_03_E2_B4
.rdata
00_43_F0_00
00_43_F9_7F
00_03_E4_00
00_03_ED_7F
.data
00_44_00_00
00_44_B3_FF
00_03_EE_00
00_04_A1_FF
.idata
00_48_10_00
00_48_1A_B7
00_04_A2_00
00_04_AC_B7
.rsrc
00_48_20_00
00_48_23_BB
00_04_AE_00
00_04_B1_BB


여기서 Raw Data의 Start는 앞에서 찾은 PointerToRawData이고,  Raw Data의 End는 PointerToRawData에 Length를 더하고 1을 빼면 됩니다.
이렇게 해서 프로그램의 Raw Data와 메모리 주소의 매핑 정보를 알아냈습니다. 이게 왜 필요하냐면, 디스어셈블러나 디버거는 메모리 주소를 기준으로 하는 반면에, 헥스에디터는 Raw Data의 위치를 알아야 하기 때문에 둘을 변환해야할 때가 있기 때문입니다.
.text 나 .data 등에 대해 더 알고 싶다면 구글에서 "PE file format"으로 검색해보면 됩니다. (예를 들어, https://reversecore.com/18)

댓글

글 목록