
Export Address Filtering(EAF)과 같은 export address table 보호 완화(mitigation) 기법의 구현
EAT(Export Address Table) 보호 완화(Export Address Filtering, EAF)의 구현
이 프로젝트는 세 개의 바이너리로 구성되며, 컴파일하면 EATGuard\bin\에서 찾을 수 있습니다:
EATGuardApplication.exe - EATGuardDll.dll을 프로세스에 로드한 다음 notepad.exe를 실행하는 일부 실행 코드(셸코드)를 실행하는 "악성" 애플리케이션.EATGuardDll.dll - 사용자 모드와 커널 모드 사이의 "브리지"를 제공하는 DLL. 이 DLL은 Vectored Exception Handler(VEH)를 등록하여 kernel32.dll EAT(Export Address Table)에 대한 접근 탐지를 EATGuardDriver.sys 드라이버로 보냅니다. 이 DLL은 kernel32.dll EAT에 가드 페이지를 할당하여 EATGuardApplication.exe 프로세스 공간 내에서 EAT에 접근할 때 예외를 발생시킵니다. 이로 인해 실행 흐름이 등록된 VEH로 이동하며, VEH는 이러한 예외를 처리하고 분석이 완료된 후 실행을 계속하는 역할을 담당합니다.EATGuardDriver.sys - kernel32.dll EAT에 대한 접근을 검증하는 커널 모드 장치 드라이버. 현재는 POC로서 kernel32.dll에 접근하는 메모리가 디스크에 의해 백업되는지 확인합니다.EATGuardApplication.exe는 EATGuardApplication.exe의 상대 경로에서 EATGuardDll.dll을 로드합니다. 즉, 실행 시 .exe와 .dll이 같은 디렉터리에 있어야 합니다. 또한 커널 디버깅이 활성화된 머신에서 이 프로젝트를 실행하지 마십시오. EATGuardDll.dll이 실행을 계속하기 위해 단일 스텝 예외(single-step exception)를 사용하기 때문에 문제가 발생할 수 있습니다. 프로젝트 사용 예시는 다음과 같습니다:
C:\Users\ANON\Desktop>sc create EATGUARD type= kernel binPath= C:\Users\ANON\Desktop\EATGuardDriver.sys
[SC] CreateService SUCCESS
C:\Users\ANON\Desktop>sc start EATGUARD
SERVICE_NAME: EATGUARD
TYPE : 1 KERNEL_DRIVER
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
PID : 0
FLAGS :
C:\Users\ANON\Desktop>EATGuardApplication.exe
[+] KERNEL32.dll EAT: 0x00007FFB1D83F898
[+] Number of functions in the KERNEL32.dll EAT: 1678
[+] EATGuard analysis complete!
[+] Target address: 0x24AA138005C
[>] IsRipRwxMemory: TRUE
[>] IsRipMappedSection: FALSE
[>] IsRipBackedByImage: FALSE
[>] HasPageProtectionChanged: FALSE
[>] RegionBaseAddress: 0x24AA1380000
[>] MemoryRegionSize: 0x1000
[>] MemoryCommtSize: 0x1000
[+] EATGuard analysis complete!
[+] Target address: 0x24AA138005F
[>] IsRipRwxMemory: TRUE
[>] IsRipMappedSection: FALSE
[>] IsRipBackedByImage: FALSE
[>] HasPageProtectionChanged: FALSE
[>] RegionBaseAddress: 0x24AA1380000
[>] MemoryRegionSize: 0x1000
[>] MemoryCommtSize: 0x1000
[+] EATGuard analysis complete!
[+] Target address: 0x24AA138008F
[>] IsRipRwxMemory: TRUE
[>] IsRipMappedSection: FALSE
[>] IsRipBackedByImage: FALSE
[>] HasPageProtectionChanged: FALSE
[>] RegionBaseAddress: 0x24AA1380000
[>] MemoryRegionSize: 0x1000
[>] MemoryCommtSize: 0x1000
[+] EATGuard analysis complete!
[+] Target address: 0x24AA138009B
[>] IsRipRwxMemory: TRUE
[>] IsRipMappedSection: FALSE
[>] IsRipBackedByImage: FALSE
[>] HasPageProtectionChanged: FALSE
[>] RegionBaseAddress: 0x24AA1380000
[>] MemoryRegionSize: 0x1000
[>] MemoryCommtSize: 0x1000
[+] EATGuard analysis complete!
[+] Target address: 0x24AA13800A2
[>] IsRipRwxMemory: TRUE
[>] IsRipMappedSection: FALSE
[>] IsRipBackedByImage: FALSE
[>] HasPageProtectionChanged: FALSE
[>] RegionBaseAddress: 0x24AA1380000
[>] MemoryRegionSize: 0x1000
[>] MemoryCommtSize: 0x1000
(...)TRUNCATED(...)
이 프로젝트는 Export Address Filtering의 기능을 모방한 POC입니다.