当前位置: 首页 > news >正文

星际争霸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:

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资格赛中的一个挑战。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

http://www.gsyq.cn/news/23653.html

相关文章:

  • 实现更公平的机器学习技术探索
  • TexSmart 文档处理器
  • 连续函数
  • winform/WPF 通信协议目录索引
  • 078_尚硅谷_单分支流程图和细节
  • SQLite使用入门
  • Layui框架使用入门
  • The 2024 ICPC Asia Hangzhou Regional Contest
  • 手机也能用的在线p图网站,大图轻松处理
  • CF2135 C. By the Assignment
  • 触想参与国家标准起草,助力行业规范化发展
  • Burp Suite Professional 2025.10 发布 - Web 应用安全、测试和扫描
  • F5 BIG-IP 15.1.10.8 - 领先的应用交付与安全服务
  • XPath索引定位深度解析://X[n]与(//X)[n]的本质区别
  • 2025年10月波形护栏厂家推荐榜单:基于公开数据的中立对比与选购参考
  • Index of /python/
  • 2025年10月项目管理工具推荐榜:十款主流平台深度对比与选购指南
  • GRPO
  • 2025年10月止痒控油洗发水评测推荐:聚焦头皮屏障修复与临床验证的排名解析
  • 2025年10月石墨电极厂家推荐排名:晶碳科技产品矩阵与合规资质透视
  • 2025年10月领先品牌认证机构推荐榜:尚普与华信人深度对比评测
  • RM500U-EA
  • 2025年10月槲皮素产品推荐榜:五款热门单品深度对比与中立评测
  • System.Windows.Forms.DataVisualization.Charting 完全指南
  • 区间压缩dp(poj3254)
  • 完整教程:C++STL之list
  • 13 Static 关键字的作用
  • DS:一个处理php前端数据的实用类
  • rk3399 安卓7 添加 exfat 格式U 盘支持
  • 2025年10月ai优化推荐对比榜:十强服务商数据化拆解与选择策略