1. IAT(Import Address Table)
- 'GetStartupInfoA' 함수 호출 주소값 찾기
- DLL 파일이 메모리 상에 로드되는 주소값을 갖고 있는 테이블이며, 암시적 링킹에서 사용한다.
- 'calc(ASLR X).exe'를 올리디버거로 오픈하여 코드창에서 '0x01012D89' 주소로 이동하여 'GetStartupInfoA' 함수 주소(0x0100114C)를 확인한다.
- 메모리창에서 '0x0100114C'로 이동하여 저장된 주소값을 확인한다.
- 10 1E 46 76 -> 0x76461E10
- 'KERNEL32.dll'의 'GetStartupInforA' 함수를 호출할때, 직접 호출하지 않고 PE 로더가 프로그램 실행시 '0x0100114C' 주소에 저장된 함수 주소 값(0x76461E10)을 갖고와서 호출한다.
- 올리디버거 -> 마우스 우클릭 -> Search for -> Name in all modules -> 'All names' 창 오픈
- GetStartupInforA 입력 실시 -> Import/Export 주소 값 확인
- 'SHGetSpecialFolderPathW' 함수 호출 주소값 찾기
- 코드창에서 '0x01044129' 주소로 이동하여 'SHGetSpecialFolderPathW' 함수 주소(0x01001000)를 확인한다.
- 메모리창에서 '0x01001000'로 이동하여 저장된 주소값을 확인한다.
- 18 04 83 75 -> 0x75830418
- 'SHELL32.dll'의 'SHGetSpecialFolderPathW' 함수를 호출할때, 직접 호출하지 않고 PE 로더가 프로그램 실행시 '0x01001000' 주소에 저장된 해당 함수 주소 값(0x75830418)을 갖고와서 호출한다.
- 올리디버거 -> 마우스 우클릭 -> Search for -> Name in all modules -> 'All names' 창 오픈
- SHGetSpecialFolderPathW 입력 실시 -> Import/Export 주소 값 확인
2. IDT(Import Directory Table)
- DLL 이미지 내의 EP(Entry Point)에 대한 RVA 정보를 포함하고 있다.
- IDT 마지막 항목은 Directory Table 끝을 나타내는 NULL 값이 설정되어 있다.
- IDT는 PE 바디 영역에 있으며, 해당 위치는 IMAGE_OPTIONAL_HEADER에 'Number of Data Diretories'에서 확인할 수 있다.
- IDT 구조체 배열 주소와 크기 구하기
- IMAGE_OPTIONAL_HEADER -> Number of Data Diretories
pFile Data Description Value
00000158 00051AFC RVA IMPORT Table
0000015C 00000154 Size
IDT 구조체 배열 주소 = 0x00051AFC <- .text 섹션 범위에 포함되어 있음
IDT 구조체 크기 = 0x154(340byte)
──────── 0x01001000
.text 섹션
-------------------- 0x01053CA1
패딩 : 0x035F
──────── 0x01053FFF
- IMAGE_OPTIONAL_HEADER -> Number of Data Diretories
- IDT 구조체 RAW 주소 구하기
- RAW = X_RVA - 섹션_RVA + Pointer to Raw Data
X_RVA 0x51AFC
섹션_RVA 0x1000
Pointer to Raw Data 0x400
파일에서 .text 섹션 범위 0x400 ~ 0x53200(0x400 + 0x52E00) 이전 - RAW = 0x51AFC - 0x1000 + 0x400 = 0x50EFC
- X_RVA가 '0x51AFC'인 경우, RAW는 '0x50EFC'이며, 파일에서 .text 섹션 범위에 포함된다.
- RAW = X_RVA - 섹션_RVA + Pointer to Raw Data
- IDT 구조체 영역 확인
- IDT 구조체의 RAW는 '0x00050EFC'이고, 크기는 0x154(340byte)이다. PEview에서 확인하도록 한다.
- SECTION .text -> IMPORT Directory Table
- IDT 구조체 배열 주소와 크기 구하기
3. IDT 구조체 배열 분석
- IDT 구조체의 첫번째 요소의 영역은 다음과 같이 20Byte로 구성되어 있다.
- SECTION .text -> IMPORT Directory Table
pFile Data Description Value
00050EFC 00051D20 Import Name Table RVA
00050F00 FFFFFFFF Time Date Stamp
00050F04 FFFFFFFF Forwarder Chain
00050F08 00051D14 Name RVA SHELL32.dll
00050F0C 00001000 Import Address Table RVA
[20 1D 05 00] FF FF FF FF FF FF FF FF 14 1D 05 00 00 10 00 00
*OriginalFirstThunk 4byte 20 1D 05 00 -> 00 05 1D 20 - INT(Import Name Table)의 RVA 주소이다.
- 주소 표기 RVA 클릭 -> SECTION .text -> IMPORT Name Table -> RVA 주소 확인 -> 00051D20
- Import되는 함수 정보들이 있는 영역의 시작 주소이다.
- INT RVA = 0x00051D20
- RAW = 0x51D20 - 0x1000 + 0x400 = 0x51120 (주소 표기를 File Offset 클릭하여 확인한다.
- 파일에서 INT 시작 주소는 '0x00051120' 이다.
20 1D 05 00 [FF FF FF FF] FF FF FF FF 14 1D 05 00 00 10 00 00
TimeDateStamp 4byte FF FF FF FF -> FF FF FF FF
시간 날짜 정보
바인딩 안된 경우 : 0
바인딩 된 경우 : -1(0xFFFFFFFF)
20 1D 05 00 FF FF FF FF [FF FF FF FF] 14 1D 05 00 00 10 00 00
ForwardChain 4byte FF FF FF FF -> FF FF FF FF
바인딩 여부와 관련 정보
20 1D 05 00 FF FF FF FF FF FF FF FF [14 1D 05 00] 00 10 00 00
*Name 4byte 14 1D 05 00 -> 00 05 1D 14
- DLL 이름의 RVA 주소이다. 즉, DLL 정보들이 있는 시작 주소이다.
- DLL Name RAV = 0x00051D14
- 주소 표기 RVA 클릭 -> SECTION .text -> IMPORT DLL Names -> 0x00051D14 주소에 저장된 값 확인 -> SHELL32.dll
- RAW = 0x51D14 - 0x1000 + 0x400 = 0x51114 (주소 표기를 File Offset 클릭하여 확인한다.)
- 파일에서 DLL Name 시작 주소는 '0x00051114' 이다.
20 1D 05 00 FF FF FF FF FF FF FF FF 14 1D 05 00 [00 10 00 00]
*FirstThunk 4byte 00 10 00 00 -> 00 00 10 00
- IAT(Import Address Table)의 RVA 주소이다.
- 즉, INT 목록에 있는 각각의 함수들이 메모리 상에 로드되는 주소 값들이 있는 시작 주소이다.
- IAT RAV = 0x00001000
- 주소 표기 RVA 클릭 -> SECTION .text -> IMPORT Address Table -> RVA 주소 1000 확인
- RAW = 0x1000 - 0x1000 + 0x400 = 0x400 (주소 표기를 File Offset 클릭하여 확인한다.)
- 파일에서 IAT 시작 주소는 '0x00000400' 이다.
- 즉, INT 목록에 있는 각각의 함수들이 메모리 상에 로드되는 주소 값들이 있는 시작 주소이다.
- Name(DLL Name)
- 파일에서 DLL Name 시작 주소는 '0x00051114' 이다.
- HxD에서 '0x00051114'으로 이동(Ctrl+g)하여 확인한다.
- 53 48 45 4C 4C 33 32 2E 64 6C 6C 00
- SHELL32.dll.
- INT(Import Name Table)
- 파일에서 INT 시작 주소는 '0x00051120' 이다.
- HxD에서 '0x00051120'으로 이동(Ctrl+g)하여 확인한다.
- 각각의 포인터 배열 요소는 4byte이며, 배열의 끝은 Null(4byte)로 설정된다.
50 23 05 00 6A 23 05 00 7E 23 05 00 A5 00 00 80 8C 23 05 00 00 00 00 00
50 23 05 00 -> 00 05 23 50 -> SHELL32.dll 첫번째 함수 RVA
6A 23 05 00 -> 00 05 23 6A -> SHELL32.dll 두번째 함수 RVA
7E 23 05 00 -> 00 05 23 7E -> SHELL32.dll 세번째 함수 RVA
A5 00 00 80 -> 80 00 00 A5 -> Ordinal
8C 23 05 00 -> 00 05 23 8C -> SHELL32.dll 네번째 함수 RVA
00 00 00 00 -> 00 00 00 00 -> NULL
- PEview -> SECTION .text -> IMPORT Name Table
pFile Data Description Value
00051120 00052350 Hint/Name RVA 00E1 SHGetSpecialFolderPathW
00051124 0005236A Hint/Name RVA 00C3 SHGetFolderPathW
00051128 0005237E Hint/Name RVA 011A ShellAboutW
0005112C 800000A5 Oridinal 00A5
00051130 0005238C Hint/Name RVA 0121 ShellExecuteExW
00051134 00000000 End of Imports SHELL32.dll
[참고] Ordinary 번호
- 'E1 00(0x00E1)'는 라이브러리 함수의 고유 번호인 Ordinary이며, Ordinary 다음에 함수 이름이 나온다.
4. Prebinding
- 링킹할때 IAT에 실제 Import하는 함수의 주소를 미리 구성하는 기능이다.
- 그렇기 때문에 로딩 시간에 IAT를 완성하지 않고 링키시 IAT를 미리 완성했기 때문에 성능 향상 및 시간을 단축시킨다.
- 이때, 로드는 BOUND IMPORT TABLE 정보를 기반으로 DLL 바운드 여부를 확인한다.
- 또한, DLL이 바운딩된 경우 링크시 IAT에 기록된 함수 주소와 메모리 상에 주소가 다르게 배정된다.
- BOUND IMPORT TABLE
- PEview -> IMAGE_NT_HEADERS -> IMAGE_OPTIONAL_HEARER -> Numer of Data Directories
pFile Data Description Value
000001A8 00000270 RVA BOUND IMPORT Table
000001AC 00000154 Size
- PEview -> IMAGE_NT_HEADERS -> IMAGE_OPTIONAL_HEARER -> Numer of Data Directories
- BOUND IMPORT Directory Table
- PEview -> IMAGE_NT_HEADERS -> BOUND IMPORT Directory Table
- 주소 표기 RAV 클릭
- Offset to Module Name : Import된 DLL 파일명이 있는 주소
- 첫 비트에서 '0x98' 만큼 이후에 DLL이 바운드되어 있다.
RVA Data Description Value
00000270 4CE7B9DE Time Data Stamp 2010/11/20 12:06:54 UTC
00000274 0098 Offset to Module Name SHELL32.dll
00000276 0000 Number of Module Forwarder Refs
- 첫 비트에서 '0x98' 만큼 이후에 DLL이 바운드되어 있다.
'메가IT아카데미 국기과정 > 리버싱과 악성코드 분석' 카테고리의 다른 글
[1-10] 패킹&언패킹 (0) | 2022.09.13 |
---|---|
[1-9] PE 파일 분석(API&DLL) (0) | 2022.09.13 |
[1-7] PE 파일 분석(PE 재배치) (0) | 2022.09.13 |
[1-6] PE 파일 분석(PE 바디-섹션) (0) | 2022.09.13 |
[1-5] PE 파일 분석(RVA to RAW) (0) | 2022.09.13 |