发布日期:2007-09-06
更新日期:2007-09-07
受影响系统:
GlobalLink GlobalLink 2.7.0.8
描述:
--------------------------------------------------------------------------------
BUGTRAQ ID: 25565
联众世界游戏大厅是联众世界自主开发的一款集棋牌、休闲、对战于一体的游戏客户端。
联众世界游戏大厅所安装的GLItemCom.DLL ActiveX控件过于信任用户输入,未检测用户提供的字符串长度,导致对象虚函数表指针被覆盖,从而获得系统控制权。
IE首先创建obj_vuln对象,位置恰好在obj_now对象下:
03803034 /$ 56 PUSH ESI 03803035 |. 8BF1 MOV ESI,ECX 03803037 |. 6A 58 PUSH 58 ; 对象大小:58h,即88字节 03803039 |. 8366 10 00 AND DWORD PTR DS:[ESI+10],0 0380303D |. 8366 14 00 AND DWORD PTR DS:[ESI+14],0 03803041 |. 8366 18 00 AND DWORD PTR DS:[ESI+18],0 03803045 |. C706 C4048103 MOV DWORD PTR DS:[ESI],038104C4 0380304B |. E8 2C370000 CALL 0380677C ; 创建obj_vuln对象 03803050 |. 85C0 TEST EAX,EAX 03803052 |. 59 POP ECX 03803053 |. 74 0A JE SHORT 0380305F 03803055 |. 56 PUSH ESI 03803056 |. 8BC8 MOV ECX,EAX 03803058 |. E8 390D0000 CALL 03803D96 ; 初始化obj_vuln对象 0380305D |. EB 02 JMP SHORT 03803061 0380305F |> 33C0 XOR EAX,EAX 03803061 |> 6A 08 PUSH 8 03803063 |. 8946 08 MOV DWORD PTR DS:[ESI+8],EAX ; 保存 obj_vuln==>[ESI+8] 记住这个,后面要提到 |
然后进入SetInfo()流程:
03802F25 |> \56 PUSH ESI ; /EvilString <=== 嘿嘿~ 03802F26 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; | 03802F29 |. FF75 0C PUSH DWORD PTR SS:[EBP+C] ; |Arg7 03802F2C |. 8D48 14 LEA ECX,DWORD PTR DS:[EAX+14] ; | 03802F2F |. FF75 20 PUSH DWORD PTR SS:[EBP+20] ; |Arg6 03802F32 |. FF75 1C PUSH DWORD PTR SS:[EBP+1C] ; |Arg5 03802F35 |. FF75 18 PUSH DWORD PTR SS:[EBP+18] ; |Arg4 03802F38 |. FF75 10 PUSH DWORD PTR SS:[EBP+10] ; |Arg3 03802F3B |. FF75 F8 PUSH DWORD PTR SS:[EBP-8] ; |Arg2 03802F3E |. FF75 F4 PUSH DWORD PTR SS:[EBP-C] ; |Arg1 03802F41 |. E8 7E010000 CALL 038030C4 ; \调用SetInfo() F7跟进 |
跟进SetInfo(),会将EvilString填充到obj_now里面:
038030C4 /$ 55 PUSH EBP 038030C5 |. 8BEC MOV EBP,ESP 038030C7 |. 56 PUSH ESI 038030C8 |. 8BF1 MOV ESI,ECX 038030CA |. FF75 10 PUSH DWORD PTR SS:[EBP+10] 038030CD |. B9 90568103 MOV ECX,03815690 038030D2 |. FF75 0C PUSH DWORD PTR SS:[EBP+C] 038030D5 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] 038030D8 |. E8 DB040000 CALL 038035B8 038030DD |. FF75 20 PUSH DWORD PTR SS:[EBP+20] 038030E0 |. 8D46 1C LEA EAX,DWORD PTR DS:[ESI+1C] 038030E3 |. 50 PUSH EAX 038030E4 |. E8 37350000 CALL 03806620 038030E9 |. FF75 24 PUSH DWORD PTR SS:[EBP+24] ; EvilString 038030EC |. 8D46 3C LEA EAX,DWORD PTR DS:[ESI+3C] ; obj_now+0x3C obj_new偏移60字节处 038030EF |. 50 PUSH EAX : 038030F0 |. E8 2B350000 CALL 03806620 ; EvilString复制到obj_now+0x3C <== 问题出在这里,没有检测EvilString的长度. |
执行完SetInfo()后,看堆里的情况:
$ ==> 03823D80 038104C4 ?? <=== obj_now的开头 ___FCKpd___34 03823D84 03823D68 h=? ___FCKpd___38 03823D88 03823DE0 ?? ___FCKpd___3C 03823D8C 03823E48 H>? ___FCKpd___310 03823D90 00000001 ... ___FCKpd___314 03823D94 00000001 ... ___FCKpd___318 03823D98 00000001 ... ___FCKpd___31C 03823D9C 00000000 ... . ___FCKpd___320 03823DA0 00000000 ... . ___FCKpd___324 03823DA4 00000000 ... . ___FCKpd___328 03823DA8 00000000 ... . ___FCKpd___32C 03823DAC 00000000 ... . ___FCKpd___330 03823DB0 00000000 ... . ___FCKpd___334 03823DB4 00000000 ... . ___FCKpd___338 03823DB8 00000000 ... . ___FCKpd___33C 03823DBC 41414141 AAAA <=== EvilString 开头 ___FCKpd___340 03823DC0 41414141 AAAA ___FCKpd___344 03823DC4 41414141 AAAA ___FCKpd___348 03823DC8 41414141 AAAA ___FCKpd___34C 03823DCC 41414141 AAAA ___FCKpd___350 03823DD0 41414141 AAAA ___FCKpd___354 03823DD4 41414141 AAAA <=== obj_now的尾部:从3Ch到58h,覆盖了28字节 ___FCKpd___358 03823DD8 41414141 AAAA // 还要填充8字节.才能到obj_vuln ___FCKpd___35C 03823DDC 41414141 AAAA // 原因估计是堆分配粒度是16字节 ___FCKpd___360 03823DE0 0D0D0D0D ... . <=== obj_vuln的vmt_ptr(虚函数表指针)被覆盖!!! |
当第2次调用SetInfo的时候,IE会先执行obj_vuln里的函数,但是obj_vuln的vmt_ptr已经被控制:
0380309F /$ 56 PUSH ESI 038030A0 |. 8BF1 MOV ESI,ECX 038030A2 |. 8B4E 08 MOV ECX,DWORD PTR DS:[ESI+8] ; ECX: obj_vuln 还记得前面的[ESI+8]么? 038030A5 |. C706 C4048103 MOV DWORD PTR DS:[ESI],038104C4 038030AB |. 85C9 TEST ECX,ECX 038030AD |. 74 06 JE SHORT 038030B5 038030AF |. 8B01 MOV EAX,DWORD PTR DS:[ECX] ; [ECX]: vmt_ptr==>EAX 038030B1 |. 6A 01 PUSH 1 038030B3 |. FF10 CALL DWORD PTR DS:[EAX] ; <=== 控制!!! 038030B5 |> 8B4E 0C MOV ECX,DWORD PTR DS:[ESI+C] 038030B8 |. 5E POP ESI 038030B9 |. 85C9 TEST ECX,ECX 038030BB |. 74 06 JE SHORT 038030C3 038030BD |. 8B01 MOV EAX,DWORD PTR DS:[ECX] 038030BF |. 6A 01 PUSH 1 038030C1 |. FF10 CALL DWORD PTR DS:[EAX] 038030C3 \> C3 RETN |
<*来源:void (void@ph4nt0m.org)
链接:http://pstgroup.blogspot.com/2007/09/tipsgloballink-glitemcomdll-setinfo.html
*>
建议:
--------------------------------------------------------------------------------
厂商补丁:
GlobalLink
----------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.ourgame.com/
最新相关文章
发表评论