CVE:CVE-2007-4802
CNNVD:CNNVD-200709-133
联众世界游戏大厅是联众世界自主开发的一款集棋牌、休闲、对战于一体的游戏客户端。
联众世界游戏大厅所安装的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的开头
$+4       03823D84       03823D68   h=?
$+8       03823D88       03823DE0   ??    
$+C       03823D8C       03823E48   H>?
$+10      03823D90       00000001    ... 
$+14      03823D94       00000001    ... 
$+18      03823D98       00000001    ... 
$+1C      03823D9C       00000000    ... .
$+20      03823DA0       00000000    ... .
$+24      03823DA4       00000000    ... .
$+28      03823DA8       00000000    ... .
$+2C      03823DAC       00000000    ... .
$+30      03823DB0       00000000    ... .
$+34      03823DB4       00000000
solution:Upgrade ourgame.com globallink to a higher version than 2.7.0.8,and avoid the version 2.7.0.8