Windows 7은 기본적으로 DLL이 랜덤한 주소로 매핑되지만, 컴파일 시 고정된 주소를 설정할 수 있습니다. JAVA 1.6버전의 MSVCR71.dll이 그 대표적인 예 인데, 항상 0x7C340000에 매핑됩니다.

EMET 에는 MandatoryASLR이라는 기능이 있는데, 이 옵션을 키면 NON-ASLR DLL을 랜덤한 주소로 매핑시켜 줍니다.

이렇게 주소가 바뀌게 되면, ROP 시 NON-ASLR DLL을 사용할 수 없게 됩니다.

 

 

제가 분석한 바로는 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