上海品茶

您的当前位置:上海品茶 > 报告分类 > PDF报告下载

起源游戏引擎的漏洞挖掘与利用.pdf

编号:92562 PDF 42页 1.04MB 下载积分:VIP专享
下载报告请您先登录!

起源游戏引擎的漏洞挖掘与利用.pdf

1、为何研究游戏引擎游戏用户基数巨大游戏公司普遍不够重视安全JUST FOR FUN何为游戏引擎何为游戏引擎游戏引擎相当于游戏的内核,是一个游戏的核心组件提供了现成的渲染引擎、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理等等功能开发者可以利用现成的游戏引擎快速的进行游戏开发游戏脚本声音AI物理引擎图形绘制内存管理网络通信何为游戏引擎游戏引擎提供了实现不同功能的API接口开发者可以使用官方提供的SDK来调用接口,实现高度可定制化的游戏开发APIGame AGame B常见的游戏引擎寒霜引擎(FROSTBITE):战地系列,FIFA系列虚幻引擎(UNREAL):质量

2、效应,战争机器起源引擎(SOURCE):CS,军团要塞,DOTA2CRY ENGINE,UNITY3D漏洞?由于性能等方面的原因,大部分的游戏引擎使用C/C+开发而在游戏引擎中的漏洞,往往能影响同引擎开发的所有游戏APIGame AGame B起源引擎起源引擎起源引擎最初为1998年为半条命开发的游戏引擎作为开放授权引擎,使用范围很广引擎构架与功能音频播放建模/动画效果渲染系统Steam 集成物理引擎网络起源引擎多人游戏网络构架采用客户端-服务端网络模型服务端负责游戏规则,玩家动作同步,建立世界等客户端连接至服务端并且”遵守”规则网络流量通过UDP/IP发送起源引擎使用UDP以降低网络延时起源

3、引擎在UPD的基础上重新定义了“TCP”压缩与解压缩加密各种底层的网络处理多人游戏网络构架起源引擎客户端与服务器同步数据的基本时间间隔:TICK每一次TICK中,服务器会将游戏的快照发送给客户端快照中包含着在此TICK中所有已经改变的实体客户端只负责将用户的输入发给服务器多人游戏网络构架快照 tick(角色移动,死亡)输入 tick(w,a,s,d,鼠标点击等)起源引擎起源引擎中,传输信息的基本单位根据发送者分成三大类server messageclient messagenetwork message(客户端与服务端都会发送)Message起源引擎 net_NOP net_Disconnec

4、t net_File net_LastControlMessage net_SplitScreenUser net_Tick net_StringCmd net_SetConVar net_SignonStateNetwork Message客户端和服务端都可以发送的消息,以net_开头起源引擎 clc_ClientInfo clc_Move clc_VoiceData clc_BaselineAck clc_ListenEvents clc_RespondCvarValue clc_FileCRCCheck clc_LoadingProgress clc_SplitPlayerConnect

5、 clc_ClientMessage clc_CmdKeyValuesClient Message由客户端发送,以clc_开头起源引擎 svc_ServerInfo svc_SendTable svc_CreateStringTable svc_UpdateStringTable svc_UserMessage svc_EntityMessage svc_GameEvent svc_PacketEntities svc_TempEntities svc_GameEventList svc_GetCvarValue svc_CmdKeyValues.Server Message由服务端发送,以s

6、vc_开头起源引擎Server Messagesvc_UserMessage是游戏相关的一种特殊的message。由服务器发送,用来通知各种各样的游戏事件。有着数量众多的子消息类型,每个游戏都有区别。数量众多,但是漏洞通常没有办法其他游戏中存在E.g:CS_UM_ShowMenu/TF_UM_ShowMenu CS_UM_SayText.svc_UserMessageShowMenu.起源引擎Network Entities实体(Entities)在客户端和服务端同时存在起源引擎将几乎所有的东西都抽象为实体。服务器会保证所有客户端的实体保持同步只有和客户端有关的实体才会被创建或者更新(可见的/

7、可以听到的)当客户端收到svc_PacketEntities消息时,会自动创建不存在的实体。起源引擎最多可以同时持有2048个实体。实体通常是在snapshots中发送的。ABDC起源引擎ConVars and ConCommandsConsole Variables 储存了服务端和客户端的各种配置参数,类型linux中的环境变量有一些Console Variables会在客户端和服务端上同步Console Variables有各种属性,其中有一些可以被远端读取和设置e.g:bot_dont_shoot:设置后,bots将不会开火host_map:当前地图名字(只读,不可设置)Console

8、Commands是一些命令用来实现各种附加功能本质上是一些拥有特殊属性的ConVarse.g:retry:重新连接上一次连接的服务器 gods:所有玩家无敌起源引擎ConVars and ConCommandssvc_GetCvarValue:服务端可以通过发送这个消息获取客户端的Cvarclc_RespondCvarValue:客户端通过这个消息给服务端返回Cvarnet_StringCmd:客户端和服务端都可以发送这个消息让对方执行cmdGetCvarValueRespondCvarValueStringCmd起源引擎Message格式起源引擎默认使用bitstreams来传输messag

9、e消息每个游戏可以自定义消息的传输格式例如:CSGO使用google protocol代替bitstreams来传输消息但是某些特殊的消息(例如svc_PacketEntities)依然使用bitsteams起源引擎漏洞挖掘起源引擎漏洞挖掘攻击面有哪些?Message:直接接受并处理网络数据,非常容易出问题engine.dll:引擎的核心,包括net_X 和svc_X 消息的处理函数client.dll:绝大部分游戏相关代码,所有svc_UserMessage子消息的处理函数Cvar:有数千个Cvar,许多可以由服务端来设置地图解析:起源引擎的地图格式为BSP,客户端会自动的从服务端下载地图并

10、加载音频解析起源引擎TF2中的整形溢出服务端可以发送svc_CreateStringTable消息以创建一个字符串列表。这个字符串列表记录了服务端经常发送的一些字符串通过这个列表,服务端只需要发送一个index地址来代替字符串起源引擎TF2中的整形溢出*this,SVC_CreateStringTable*creatstrtab)char CBaseClient:ProcessCreateStringTable(void.int dataBits;/edx2 void*dest;/edi8 char*source;/esi8.int destLen;/esp+30h ebp-Ch8 int s

11、ourceLen;/esp+38h ebp-4h6.if(creatstrtab-isCompressed)/#1/#2dataIn=&creatstrtab-m_DataIn;.destLen=READ32(dataIn);sourceLen=READ32(dataIn);.dest=operator new(destLen+3)&0 xFFFFFFFC);source=operator new(sourceLen+3)&0 xFFFFFFFC);bf_read:ReadBits(dataIn,source,8*sourceLen);NET_BufferToBufferDecompress(

12、dest,&destLen,source,sourceLen);.operator delete(dest);operator delete(source);.CS:GO中不存在此bug起源引擎CSGO中的数组越界写UM_ProcessSpottedEntityUpdate函数用以处理CS_UM_ProcessSpottedEntityUpdate消息至于具体的作用,不用关心起源引擎CSGO中的数组越界写*data)int ProcessSpottedEntityUpdate(_BYTE*this,ProcessSpottedEntityUpdate_t.for(i=0;idx numEnti

13、ties;i=idx)entitiesArray=data-entitiesArray;entName=0;update=entitiesArrayidx;ent_idx=update-ent_idx;.objidx=0 x1E0*&this_objidx*&this_objidx*&this_objidx*&this_objidx*&this_objidx*&this_objidx*ent_idx;-16=4*update-origin_z;-24=4*update-origin_x;-20=4*update-origin_z;-12=0;-8=update-angle_y;4=0;.TF2

14、中不存在此bug.signed int newEntity;/edx1.IClientNetworkable*ent;/edi3.newifent ifreturn Host_Error(CL_CopyNewEntity:invalid class index(%d).n,iClass);.if(ent)v8=ent-vtbl-someMethod(ent);.起源引擎CL_CopyNewEntity中的符号整形溢出服务器会在每个tick中发送svc_PacketEntities消息以更新和创建那些已经发生改变的实体Entity=u-m_nNewEntity;(newEntity=2048)r

15、eturn Host_Error(CL_CopyNewEntity:m_nNewEntity=MAX_EDICTS);=entitylist-vtbl-GetClientNetworkable(newEntity);(iClass=gClassMaxIndex)IClientNetworkable*GetClientNetworkable(CClientEntityList*this,int index)return(&this-m_EntityCacheInfo)2*index;起源引擎只要伪造一个object,越界读取回我们伪造的object,调用类虚方法的时候就可以控制eip漏洞出现在起

16、源引擎内核中,影响所有游戏CL_CopyNewEntity中的符号整形溢出起源引擎我们需要让entitylist.m_EntityCacheInfoidx指向我们伪造的结构体让我们看看GetClientNetworkable 的汇编实现GetClientNetworkable proc nearindexpush mov mov mov pop retn=dword ptr8 ebpebp,espeax,ebp+index eax,ecx+eax*8+28h ebp4GetClientNetworkable endp负数的index可以绕过长度检查。因为index会乘以8,所以可以构造任意in

17、dex值现在我们需要在.data 段构造数据整形溢出利用起源引擎怎么在.data段存储数据?让我们看看 UserMessagesUM_ShowMenu 消息用来在客户端显示菜单此消息会储存数据在client.dll 的数据段中所以,现在的思路是发送UM_ShowMenu 消息来伪造C+类。然后触发svc_PacketEntities 中的漏洞整形溢出利用svc_UserMessage (UM_ShowMenu)svc_PacketEntit ies(Bugger)client.dllentitylist.m_EntityCacheInfofake_obj=0 x41414141,0 x4242

18、4242,0 x43434343,.起源引擎由于aslr的关系,还需要考虑leak让我们再看看CL_CopyNewEntity()函数整形溢出利用intcdecl CL_CopyNewEntity(CEntityReadInfo*u,int iClass,int iSerialNum).ent=CL_CreateDLLEntity(u-m_nNewEntity,iClass,iSerialNum);if(!ent).return Host_Error(CL_ParsePacketEntities:Error creatingentity”);.ent=(entitylist-vtbl-GetC

19、lientNetworkable)(u-m_nNewEntity);if(!ent).return Host_Error(CL_ParseDelta:invalid recv table for ent%d.n,u-m_nNewEntity);.起源引擎当实体不存在时(GetClientNetworkable 函数返回NULL),CreateDLLEntity函数会自动创建一个新的实体最后由AddEntityAtSlot函数添加实体可以看到,最后实体被添加到的EntityArray数组中整形溢出利用int*CBaseEntityList:AddEntityAtSlot(unsigned int

20、*EntityArray,IClientNetworkable*ent_object,int index,int serial_num)unsigned int*object_ptr;/eax1.object_ptr=&EntityArray4*index+1;*object_ptr=ent_object;if(serial_num!=-1)EntityArray4*index+2=(unsigned int)serial_num;.起源引擎有两个数组m_EntityArray 和m_EntityCacheInfo有一个index只要m_EntityCacheInfo中的值为NULL,就可以在

21、m_EntityArray中创建一个C+对象整形溢出利用0 x00000000.C+object.m_EntityCacheInfom_EntityArrayidx起源引擎现在我们有了一个C+对象的指针如果我们将它作为一个字符串读取回来,就可以leak出vtable从而绕过aslr所以,怎么读?答案是Cvars 有许多的Cvar储存在clinet.dll 的.data段中,可以被覆盖Cvar有一个char*str_value 字段。只要将它替换为C+对象指针。然后用svc_GetCvarValue 来读取整形溢出利用起源引擎所以,现在的攻击思路是这样的整形溢出利用svc_GetCvarValu

22、e(corrupted_ cvar)svc_PacketEntities (corrupt_cvar)svc_ResponCvarValue(corrupt ed_cvar)svc_UserMessage(Sh owMenuMessage)svc_PacketEntities (pwn)起源引擎现在还有一个问题由于整形溢出,之后的函数检查将会失败。Host_Error 函数将会断开客户端和服务端的连接需要让客户端重新连接服务器整形溢出利用int cdecl CL_CopyNewEntity(CEntityReadInfo*u,int iClass,int iSerialNum).ent=ent

23、itylist-vtbl-GetClientNetworkable(u-m_nNewEntity);if(!ent).return Host_Error(CL_ParseDelta:invalid recv table for ent%d.n,u-m_nNewEntity);.起源引擎还记得ConCommands么?:)ConCommands中正好有这么一个命令 retry:重新连接上一次连接的服务器整形溢出利用虽然没有办法给一个已经断开连接的客户端发送命令。但是可以将command 和 svc_PacketEntities放在同一个数据包中发送由于command会延时执行的原因,retry命

24、令可以在服务器断开连接之后执行起源引擎所以,改进之后的攻击思路是这样的。整形溢出利用svc_GetCvarValue(corrupted_ cvar)svc_PacketEntities(corrupt_cvar)+net_StringCmd(retry)svc_ResponCvarValue(corrupt ed_cvar)svc_UserMessage(Sh owMenuMessage)svc_PacketEntities (pwn)Wait for client reconnect.攻击演示TODOTODO游戏引擎的安全性很低不要连接陌生的游戏服务器Fuzzing 游戏引擎的某些模块,比如地图解析谢谢

友情提示

1、下载报告失败解决办法
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站报告下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。

本文(起源游戏引擎的漏洞挖掘与利用.pdf)为本站 (云闲) 主动上传,三个皮匠报告文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三个皮匠报告文库(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。
会员购买
客服

专属顾问

商务合作

机构入驻、侵权投诉、商务合作

服务号

三个皮匠报告官方公众号

回到顶部