EMET 4.1에서는 ROP가 주요 함수들을 호출하여 공격하는 것을 막기 위하여 주요 함수들에 후킹을 걸어 감시합니다.

Deep Hooks 라는 기능이 있는데 이것은 좀 더 많은 API를 커버하는 기능입니다.

예를 들어, VirtualProtect를 호출하면 VirualProtect->VirtualProtectEx->NtProtectVirtualMemory 순으로 호출하는데요, Deep Hooks 기능을 키면 NtProtectVirtualMemory를 후킹합니다. 이걸 옵션으로 뺀 이유가, 다른 시큐리티 회사들이 호환성 문제 때문에 클레임을 걸었다는군요.

아래는 비교 표 입니다. Undocumented API를 커버하여 주네요. 

 

Deep Hooks가 기본 값이 아니기 때문에, 공격자들은 VirtualProtect가 아닌 NtProtectVirtualMemory를 호출하여 우회할 수도 있습니다.

또한 Deep Hooks를 키면 Kernelbase도 추가로 후킹을 합니다.

제가 분석한 바로는 EMET 4.1 에서는 ROP를 차단하기 위해 주요 함수들 - VirtualProtect / VitualAlloc 등을 후킹 한 뒤, 해당 함수들의 호출 지점을 디스어셈블링 하여 해당 함수가 Call로 호출되는지 판단합니다.

패킹된 EXE면 항상 Call 한다는 보장이 없기 때문에, 테스트를 해보았습니다.

 

해당 EXE를 빌드 후, CodeVirtualizing 하였습니다

그 다음 해당 EXE를 EMET로 보호 후, 디버거를 붙인 다음 VirtualProtect 지점에 BP를 걸었습니다.

 

ESP가 가리키는 리턴 주소가 0x40A277입니다. 따라가봅니다.

 

0x40A277 부분이 CALL이 아닌 JMP군요. 논패킹 EXE라면 아래 그림과 같이 되어있습니다.

 

EMET는 호출 지점이 Call이 아니면 진단합니다.

  

보통 ROP는 RETN / JMP 로 함수를 호출하기 때문에 이런 방어법은 강력한 차단 수단이 될 수 있지만, 패킹된 프로그램의 경우 오진이 발생하니 패킹 여부를 인식할 필요가 있을 것 같습니다. 

 

+ Recent posts