星际争霸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资格赛中的一个挑战。

相关推荐
薛定谔的猫19825 分钟前
十七、用 GPT2 中文对联模型实现经典上联自动对下联:
人工智能·深度学习·gpt2·大模型 训练 调优
壮Sir不壮17 分钟前
2026年奇点:Clawdbot引爆个人AI代理
人工智能·ai·大模型·claude·clawdbot·moltbot·openclaw
PaperRed ai写作降重助手25 分钟前
高性价比 AI 论文写作软件推荐:2026 年预算友好型
人工智能·aigc·论文·写作·ai写作·智能降重
玉梅小洋29 分钟前
Claude Code 从入门到精通(七):Sub Agent 与 Skill 终极PK
人工智能·ai·大模型·ai编程·claude·ai工具
-嘟囔着拯救世界-41 分钟前
【保姆级教程】Win11 下从零部署 Claude Code:本地环境配置 + VSCode 可视化界面全流程指南
人工智能·vscode·ai·编辑器·html5·ai编程·claude code
正见TrueView42 分钟前
程一笑的价值选择:AI金玉其外,“收割”老人败絮其中
人工智能
Imm7771 小时前
中国知名的车膜品牌推荐几家
人工智能·python
风静如云1 小时前
Claude Code:进入dash模式
人工智能
TM1Club1 小时前
AI驱动的预测:新的竞争优势
大数据·人工智能·经验分享·金融·数据分析·自动化
陈天伟教授1 小时前
人工智能应用-机器听觉:15. 声纹识别的应用
人工智能·神经网络·机器学习·语音识别