PE 파일에서 myhack3.dll을 임포트하도록 IDT를 비롯해 TextView.exe PE patch를 진행해보자.
Step1. IDT 주소 확인
IDT는 .rdata 섹션에 포함되어 있으며,
RAW = 0x84CC - 0x6000 + 0x5200 = 0x76CC 이고, IID 구조체(크기 0x14) 5개로 구성되어 있다.
Step2. IDT 마지막에 IID 구조체 추가 여부 파악
.rdata 섹션을 살펴보면 IDT 다음에 바로 INT가 등장하므로 IID 구조체 덧붙일 수 없음
IDT를 파일의 빈 영역에 (NULL padding이면서 메모리에 로드되는 영역) 옮기면 됨
.rdata file offset: 0x5200 ~ 7E56 (사용되는 영역), 0x7E57 ~ 0x7FFF (NULL padding)
RVA=0x6000, VirtualSize=0x2C56이지만 메모리 로드 시 Section Alignment(0x1000)에 맞춰 0x6000~0x8FFFF 매핑
=> file이 0x2E00만큼이 전부 로드되고, 나머지 0x200은 NULL로 채워짐
=> 따라서 file offset 0x7E57~0x7FFF을 이용하면 되겠다 : 나는 0x7E60부터 사용!
Step3. PE patch
- DataDirectory[1]의 RVA, Size 수정
RVA = 0x7E60(RAW) - 0x5200 + 0x6000 = 0x8C60 , Size = 0x14*6 = 0x78
- 섹션 헤더 수정
PE가 메모리에 로딩될 때 IAT에 실제 함수 주소가 쓰여야하므로
.rdata 섹션 헤더의 Characteristics에 IMAGE_SCN_MEM_WRITE(0x80000000) 속성 추가
=> 속성 추가 안하면 '0xc0000005' 에러 코드(Access Violation Error) 뜨면서 exe파일 실행 안 됨
- 0x7E60에 기존 IDT(IID 구조체 4개) 옮기기 (기존 IDT는 놔둬도 되고 NULL로 채워도 됨)
- 0x7EB0부터 myhack3.dll IID 구조체 + NULL 구조체 위치
* INT RVA = 0x7EF0 (file offset) - 0x5200 + 0x6000 = 0x8CF0
* NAME RVA = 0x7ED8 (file offset) - 0x5200 + 0x6000 = 0x8CD8
* IAT RVA = 0x7EE8 (file offest) - 0x5200 + 0x6000 = 0x8CE8
- 0x7ED8부터 "myhack3.dll" 문자열, 0x7EE8부터 IAT(8byte) + INT(8byte), 0x7F00부터 hint+"dummy" 문자열
* Hint/Name RVA = 0x7F00 (file offest) - 0x5200 + 0x6000 = 0x8D00
* IAT와 INT 모두 첫번째 원소는 Hint+Function Name RVA, 두번째 원소는 NULL
1. TextView.exe 파일의 .rdata 섹션은 IAT가 위치하고 있음에도 읽기권한이 없었다
잘 실행되었던 이유?
- DataDirectory[C]에서 명시된 영역에 IAT가 존재하면 그 섹션에 쓰기 속성이 없어도 잘 동작한다
- 그렇다면 DataDirectory[C].Size를 8바이트 늘리고, 기존 IAT 영역 뒤 8byte에 myhack3.dll IAT를 추가하고, myhack3.dll IID의 다섯번째 인자를 업데이트하면 .rdata 섹션 속성 수정 안하고도 잘 동작하겠네!
2. PE Tools 사용처
- 프로세스 덤프 (full, partial, region)
- Tools - PE Editor : 원하는 PE 파일의 헤더 편리하게 수정 가능
'security > 리버싱핵심원리' 카테고리의 다른 글
Code Injection - using assembly (0) | 2023.03.24 |
---|---|
Code Injection (0) | 2023.03.23 |
EjectDll.exe 구현 (0) | 2023.03.20 |
SetWindowsHookEx()를 이용한 DLL Injection (0) | 2023.03.19 |
Registry를 이용한 DLL Injection (0) | 2023.03.18 |