security/리버싱핵심원리

PE 패치를 이용한 DLL Injection

민사민서 2023. 3. 20. 21:06

PE 파일에서 myhack3.dll을 임포트하도록 IDT를 비롯해 TextView.exe PE patch를 진행해보자.

 

Step1. IDT 주소 확인

IMAGE_OPTIONAL_HEADER32.DataDirectory[1]
.rdata 섹션 헤더

IDT는 .rdata 섹션에 포함되어 있으며,

RAW = 0x84CC - 0x6000 + 0x5200 = 0x76CC 이고, IID 구조체(크기 0x14) 5개로 구성되어 있다.

 

Step2. IDT 마지막에 IID 구조체 추가 여부 파악

.rdata 섹션을 살펴보면 IDT 다음에 바로 INT가 등장하므로 IID 구조체 덧붙일 수 없음

IDT를 파일의 빈 영역에 (NULL padding이면서 메모리에 로드되는 영역) 옮기면 됨

.rdata 섹션 마지막의 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가 위치하고 있음에도 읽기권한이 없었다

잘 실행되었던 이유?

IMAGE_OPTIONAL_HEADER.DataDirectory[C] : IAT RVA, Size 정의

- 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