联众世界游戏大厅是联众世界自主开发的一款集棋牌、休闲、对战于一体的游戏客户端。 联众世界游戏大厅所安装的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...
联众世界游戏大厅是联众世界自主开发的一款集棋牌、休闲、对战于一体的游戏客户端。 联众世界游戏大厅所安装的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