星际争霸1 EUD漏洞利用技术解析

利用星际争霸1 EUD漏洞

星际争霸(1998年发布)仍然是有史以来最好的策略游戏之一。20多年后,它仍然拥有强大的社区,并在2017年发布了具有更新图形和声音的重制版。然而,像大多数软件一样,它也有不少bug。其中一个bug是游戏地图中嵌入脚本的解析器中存在的任意读写漏洞。

漏洞 - Extended Unit Death

发布八年后,2006年1月18日,星际争霸补丁版本1.13f发布。该补丁说明简单地写着"修复了导致游戏利用的几个bug"。除其他外,它修复了一个特定的bug,被称为"Extended Unit Death",EUD。

星际争霸在游戏中有一个简单的脚本系统,允许地图包含小段代码来操纵游戏的某些方面,以创建新的游戏模式或故事驱动的战役地图。这些脚本称为"触发器",以简单的if-then方式结构化。每个触发器都有一组"条件"和"动作"。当触发器的所有条件都满足时,所有动作都将执行。

游戏还跟踪每个玩家杀死每种类型单位的数量。这些被称为"死亡计数器",并简单地存储在<玩家数量> x <单位类型数量>的无符号4字节条目表中。当单位被杀死时,会运行类似于unit_deaths[player_id][unit_type]++的代码。然后可以在触发器的条件部分使用这些值,将其与特定值进行比较以确定条件是否满足,基本上创建像if(unit_deaths[current_player][unit_type] == X)这样的条件。

漏洞在于这些动作中,unit_type索引未检查有效范围,因此允许我们在此数组的任何偏移处读取、写入、添加和减去值。此外,由于程序未启用PIE且数组作为全局变量存储,它具有已知地址,我们可以完全控制访问的地址。

1.13f补丁向三个函数添加了范围检查:

  • 0x004C5DD0: action_deaths_set
  • 0x004C5C60: action_deaths_add
  • 0x004C5A80: action_deaths_sub

设置

我决定尝试为此bug编写漏洞利用,目标是在另一玩家的计算机上实现完整的远程代码执行。当您在线玩星际争霸时,可以使用自己创建的地图托管游戏。每个加入游戏的玩家将从您那里下载地图,所有触发器将在每个参与者的客户端中同时运行。

该漏洞最初在版本1.13f中修补,因此只有运行较旧版本的客户端易受攻击。但许多人喜欢利用此机制创建的有趣游戏的自定义地图(称为"EUD地图"),因此创建了名为EUDEnable的工具来在内存中修补游戏并重新引入该bug。

漏洞利用

客户端本身是一个标准的32位Windows二进制文件,具有以下保护:

  • Dynamic Base: false
  • ASLR: false
  • High Entropy VA: false
  • Force Integrity: false
  • Isolation: true
  • NX: true
  • SEH: true
  • CFG: false
  • RFG: false
  • SafeSEH: false
  • GS: false
  • .NET: false

我们主要感兴趣的是它有NX但没有ASLR,因此文本和数据段将位于已知地址。

要使用此原语实际编写漏洞利用,我们需要知道死亡计数器在内存中的位置,以便了解哪些偏移对应于内存中的什么位置。由于程序没有ASLR,这很容易通过反汇编或调试游戏来确定。

第一步是控制EIP。这相当简单。在内存布局中,我们可以找到"触发器动作函数数组",这是所有可触发动作的函数指针数组。通过简单地覆盖此表中的条目并调用相应的动作,我们控制指令指针。

我们发现以下gadgets:

css 复制代码
0x0040ccb3: push [0x0050C63C]; call [0x0051BC08];
0x00469c72: pop ecx; add al, 0x89; pop esp; retn 0x8904;

这意味着如果我们将值X写入地址0x0050C63C,将值0x00469c72写入地址0x0051BC08,最后使用上述技术跳转到地址0x0040ccb3,将导致esp寄存器设置为X+0x8904+0x4,然后在X处执行指令。

现在我们有了栈转移,并使用它来执行ROP链。我们将ROP链写入bss的末尾,并在其后放置一段shellcode。bss尚不可执行,但ROP链将解决这个问题。ROP链将简单地调用VirtualProtect使bss可执行,然后返回到shellcode。

最后,我们只需要一些shellcode。对于PoC,我选择了一些32位shellcode来运行calc.exe,将其拆分为4字节块,并使用脚本将其写入ROP链之后。

结论

为我最喜欢的游戏之一研究和编写此漏洞利用非常有教育意义,尽管这是一个相当容易利用的漏洞,但当我最终成功利用并弹出计算器时,我感到非常满意。我决定让其他人也有类似的体验,因此将此漏洞变成了Midnight Sun CTF 2020资格赛中的一个挑战。

相关推荐
万俟淋曦3 小时前
【论文速递】2025年第29周(Jul-13-19)(Robotics/Embodied AI/LLM)
人工智能·ai·机器人·论文·robotics·具身智能
ghostwritten3 小时前
深入理解嵌入模型(Embedding Model):AI 语义世界的基石
人工智能·embedding
Victory_orsh3 小时前
“自然搞懂”深度学习系列(基于Pytorch架构)——01初入茅庐
人工智能·pytorch·python·深度学习·算法·机器学习
88号技师3 小时前
2025年8月SCI-汉尼拔·巴卡优化算法Hannibal Barca optimizer-附Matlab免费代码
开发语言·人工智能·算法·数学建模·matlab·优化算法
童欧巴3 小时前
教你豆包P图10个最新玩法,一次玩过瘾
人工智能·aigc
大模型真好玩3 小时前
LangGraph实战项目:从零手搓DeepResearch(二)——DeepResearch架构设计与实现
人工智能·python·langchain
Elastic 中国社区官方博客4 小时前
Elasticsearch 推理 API 增加了开放的可定制服务
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
濑户川4 小时前
基于DDGS实现图片搜索,文本搜索,新闻搜索
人工智能·爬虫·python
ReinaXue4 小时前
大模型【进阶】(六)QWen2.5-VL视觉语言模型详细解读
图像处理·人工智能·神经网络·目标检测·计算机视觉·语言模型·transformer