# CVE Number :CVE-2013-3893
# 취약점 종류 :IE Use-After-Free 코드 실행 취약점
취약점원인(PoC) 분석
본 분석에서는 Windbg 디버거와GFlag 가 사용된다.
>> 취약점 PoC코드 <<
해당 PoC 코드를 디버거를 이용하여 실행해보면, 다음과 메모리 참조 오류로 인하여 크래쉬가 발생한다.
이때, GFlag 설정을 통해 해제된 메모리의 Call Stack을 참고하면, 분석 시나리오를 설계할 때 BreakPoint(BP) 지점의 힌트를 얻을 수 있다.
mshtml!CTreeNode::GetInterface+0xac:
63662dc0 8b08 movecx,dwordptr [eax] ds:0023:f0f0f0f0=????????
HEAP_ENTRY Size Prev Flags UserPtrUserSize - state
0033a2f8 0011 0000 [03] 0033a320 0004c - (free DelayedFree)
7c97bc4c ntdll!RtlFreeHeapSlowly+0x00000037
7c957573 ntdll!RtlFreeHeap+0x000000f9
63625834 mshtml!CTreeNode::Release+0x0000002d
636266b2 mshtml!CMarkup::UnloadContents+0x00000381
63751297 mshtml!COmWindowProxy::SwitchMarkup+0x0000059f
정상적인 경우, 이렇게 생성된 메모리는 해당 메모리에 담긴 vtable을 참조해서 Function을 호출하기 위한 다음 코드에서 참조가 이루어진다.
앞서 Call Stack 에서 확인된 바대로, 다음 스크립트 코드를 수행하면 앞서 생성된 개체가 존재하는 메모리 번지가 해제된다.
해당 메모리가 실제 해제되는 지 전/후의 디버그 로그를 통해 확인해보자.
> Before Free 0033a320 ( 메모리 해제 전 )
>0033a320 0495b288 635ba8c0 mshtml!CBodyElement::`vftable'
mshtml!CTreeNode::Release+0x1e:
> After Free 0033a320 ( 메모리 해제 후 )
이렇게 이미 해제되어 버린 메모리를 정상적인 경우처럼 참조하기 때문에 다음과 같이 메모리 참조 오류가 발생한다.
eax=f0f0f0f0 ebx=0033a320ecx=00000003 edx=00000000 esi=636397e4 edi=63662c78eip=63662dc0 esp=03b7ef08 ebp=03b7ef20
mshtml!CTreeNode::GetInterface+0xac:
63662dc0 8b08 movecx,dwordptr [eax] ds:0023:f0f0f0f0=????????
지금까지는 POC를 통해서 취약점 발생 부분을 분석해보았다.
이제 특별한 코드를 추가해서 사용자 입력을 통해 프로그램 흐름(EIP)을 변경할 수 있는 지 확인해보자.
변경된 코드를 다시 실행해 보면, 해제된 메모리 부분에 삽입된 코드로 인하여 새로운 개체가 생성되어 재사용 되는 것을 확인할 수 있다.
> Create CTreeNode at 049ecee8
049ecee8 049ece80 635ba8c0 mshtml!CBodyElement::`vftable'
049ecee8 049ece80 635ba8c0 mshtml!CBodyElement::`vftable'
049ecee8 635c0ad0 636170bb mshtml!CDivElement::PrivateQueryInterface
mshtml!CTreeNode::GetInterface+0xb6:
63662dca ff11 call dwordptr [ecx]ds:0023:636170bb=8bff558b
(8fc.aa0): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
삽입된 코드로 인하여 최종적으로 호출되는 CALL의 지점이 변경되는 것을 알 수 있다. 이때, 이미 해제된 메모리는 재사용되어 다음과 같이 Free 가 아닌 Busy 상태이다.
HEAP_ENTRY Size Prev Flags UserPtrUserSize - state
049ecec0 000c 0000 [03] 049ecee8 00028 - (busy)mshtml!CDivElement::`vftable'
7c97b394 ntdll!RtlAllocateHeapSlowly+0x00000044
7c948f21 ntdll!RtlAllocateHeap+0x00000e64
자, 이제 사용자 입력을 통해 프로그램 흐름(EIP)을 변경할 수 있다는 확인하였다.
공격코드(Exploit) 분석
해당 공격코드는 시스템 환경을 체크해서 Windows XP와 Windows 7에서 동작한다.
단, Windows 7의 경우, Office 버전이 존재하지 않으면 실행하지 않는다.
취약점이 발생하고 실제 페이로드(Payload)로 점프하는 코드는 다음이다.
77bc5ed5 의 코드를 실행하고 나면 다음과 같이 CALL 스택의 변경되고, 이후 순차적으로 ROP 가젯의 코드를 수행하게 된다.
- 끝 -
'새빨간거짓말' 카테고리의 다른 글
CVE-2014-0160 OpenSSL heartbleed 취약점 (0) | 2014.04.11 |
---|---|
CVE-2014-0322 제로데이 취약점 (0) | 2014.02.17 |
[소식] 9.11 악성코드 배포 (0) | 2013.09.11 |
[열한번째 거짓말] CVE-2011-2110 Adobe Flash 취약점 (53) | 2011.07.06 |
[열두번째 거짓말] CVE-2011-1255 MS11-050 MS time element 취약점 (0) | 2011.06.27 |