GOM Player 2.0.12 (.ASX) Stack Overflow Exploit Document V0.2 HACKING GROUP OVERTIME OVERTIME mrboo< bsh7983@gmail.com > 2009.01.10
이문서는 2009.01.08일자로 milw0rm에 DATA_SNIPER께서등록한곰플레이어관련 exploit을분석한문서이다. Study를목적으로만들었고잘못된분석일가능성이너무많기때문에서로공유는하되잘못된부분은메일로지적바란다.^^ < 목차 > 1. execute exploit 2. analyze exploit 3. analyze asx file 4. summary
1. execute exploit 우선분석하기전에 milw0rm에올라온 exploit 을한번실행해본다. 이취약점은이전에 Parvez Anwar 께서 2007 년 2 월초에 GOM Player ASX Playlist Buffer Overflow라는이름으로발표를한적이있다. ref href 태그를이용해서 URI 링크를시키는데 length 체크를하지않아긴 URI를넣음으로써스택기반의버퍼오버플로우가발생된다. 1.1 실행환경 OS : Microsoft Windows XP Pro V2002 SP2 GOM Version : 2.0.12.3375.3375 1.2 exploit 컴파일 exploit download : http://milw0rm.com/exploits/7702 compiler : Visual Studio.NET 2003 1.3 바이너리실행 해당 exploit 을컴파일하고실행을한다.
같은위치에 GAZA.asx GAZA.asx 파일이생성된다. < 생성된악성 asx 파일 > GAZA.asx GAZA.asx 파일을실행시키면곰플레이어가실행되면서계산기가실행된다. < 악성코드로인해실행된계산기 >
2. analyze exploit 다음으로 milw0rm에등록된 expolit 을분석해보자 2.1 exploit 분석 Header1[] : asx 파일포멧의헤더부분. Header2[] : asx 파일포멧의끝부분. Shell[] : windows cale( 계신기 ) code. RET_ T_Univ[] : 0x00464577 00464577, 스택오버플로우로 EIP 덮어씌울주소 Nop[] : Nops 8Bytes Payload : 메모리 copy 및파일생성위배열을 Header1+junk(0x41)+RET_Univ+Nop+Shell+Header2 순으로 payload 를생성후 GAZA.asx 파일에 write 함.
3. analyze asx file 생성된 GAZA.asx 파일을분석해보자 3.1 ASX 란? ASF Stream Redirector 실제동영상데이터가아닌텍스트정보만을가지고있는메타파일임. 메모장등에서열어보면 HTML 과유사한형식으로이루어져있음. 이파일에는실제동영상이위치하고있는 URL 정보와그외의기타정보 ( 저작권, 만든이, 제목 ) 등을표기할수있고배너광고를삽입하여자사의동영상컨텐츠를보호및홍보할수있는기능을제공함. 3.2 ASX 의기초 <asx version = "3.0" > <entry> <ref href = "mms://overtimes overtimes.com.kr/test.asf"/> </entry> </asx> 3.2 GAZA.asx 분석 위에서설명했듯이 GAZA.asx 파일을메모장으로열어보자
Ollydbg 로분석해보자취약한곰플레이어파일을올리로로드한다. 그리고 GAZA.asx 파일을파일열기로한상태에서브레이크포인트걸리게한다. 그럼메모리에 GAZA.asx 파일이로딩됨을알수있다.( 메모리서칭기능으로쉘코드의연속된부분을검색어로서칭하면찾을수있다 ) 그리고해당메모리에 memory bp 를걸어놔서이부분을건드는코드를선별한다. 우선이런식으로접근해보자. step over(f8) 로계속 call 문을지나쳐보면계산기가뜨는시점을찾을수있다. 그럼해당 call 문을 step into(f7) 로자세히분석해보자. 수상한것 (??) 는혹시몰라캡쳐를해놨으며이문서에도그냥덧붙였다. 별도설명이없으면그냥넘어가도될듯하다.
위그림중아래와같은 CALL 문이눈에보인다. 우선해당함수가무슨일을하는지확인해보자
루프문이다. 해당 DS:[ESI] 부분을 dump 해보니아래와같다. 메모리에있는 asx 파일내용을메인스레드의 Stack 영역으로복사하는것을볼수있다. 복사하는내용은 asx 파일내용중 <ref href = = 태그다음에오는실제동영상파일의주소이다. 현재는쉘코드이다. IDA 에서분석을하면 wcscpy 라는심볼명을가진함수임을알수있다. <IDA 로해당심볼확인, wcscpy> wcscpy 는어떤함수일까? strcpy 의유니코드버전이라고보면된다고한다. 파일 I/O 나문자열처리시기본적으로 2Bytes 로처리를해버리게되서사용한다고한다. 그런데이함수는보안에취약하다. 복사할사이즈를정해주는파라미터가없으며, wcscpy(dst, src) 중 src 가 null 로종료를하지않으면그대로복사가되고버퍼가플로우가되게된다. 즉 href= href= 다음의주소를 length 체크를하지않고복사하기때문에우리의쉘코드가오버플로우되면서로딩될수있었던거다. 이함수대신사용할수있는 wcscpy_s(dst, dst_size, src) 함수가있다고한다. 암튼우리는양껏쉘코드를스택에넣을수있게됬다. 이제우리는스택의쉘코드를실행시켜줄 EIP 를변조시키면된다. 계속분석해보면위 wcscpy 를해놓고 EAX 에 SS:[EBP+1098] 이가리키는값을 EAX 에넣는다. 여기서는 FFFFFFFF 가되겠다. 이값을 201,202,203,102,103,401,303,601,311,312, 01,311,312,901,701,702,101,301,501,801 01,701,702,101,301,501,801 값과비교를하고는아래그림부분에가게된다. 위값을잘은모르겠르겠으나정상적인파일을올리면 202 가됨을볼수있다. 아마에러처리부분?? 꼭웹에러번호러번호처럼.
그럼계속분석해보자. 위 FFFFFFFF 값으로어느것하나일치가안되고는아래그림으로넘어가게된다. RET_Univ 가기억날것이다. 기억이안나면위 2. analyze exploit 를참고 즉위그림에설명처럼 RETN4 를함으로써 RET_Univ 의주소 (0x00464577) 4577) 가 EIP 에저장되고실행된다. 해당주소번지에는 JMP ESP opcode 가있다. 그럼 ESP 로점프하게되고 ESP 에있는우리의 NOP 코드를확인할수있다. 짧은 NOP 슬레이드를타시고바로 calc 코드를실행하여계산기가실행이된다.
4. summary 간단하게버퍼오버플로우에취약한함수로생기는홀이있었으며곰플레이어가이런함수를사용함으로써 exploit 이생겨난것임. 내생각엔 언제봐도이런취약점을발견하신분은참대단한거같다. 어떻게이런생각을하지??????? 아니어떻게이렇게짜고치는고스톱처럼서로상관없을듯한, 서로멀리떨어진듯한코드들이이렇게연관성있게실행되게끔하는건지참 대단한거같다. 암튼오늘도그냥고수분들대단하단거느끼며문서를마칠까한다 ;; 작성한문서내용은제지식위주로하여틀린부분이많을수있다는위험이있단사실을명심하시고지적바란다. 마지막으로패치후에코드가어떻게변했는지한번확인해보자. 감사합니다.