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

news/2025/10/18 15:18:22/文章来源:https://www.cnblogs.com/qife122/p/19149749

利用星际争霸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.mzph.cn/news/939628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现更公平的机器学习技术探索

本文探讨了通过经验风险最小化理论实现更公平机器学习模型的三种技术方法,包括预处理、后处理和过程中处理,分析了在回归任务和深度学习中的应用,并提出了基于Wasserstein重心和分布距离度量的公平性改进方案。迈向…

TexSmart 文档处理器

TexSmart 文档处理器,自用工具@media only screen { #comment_form.commentform, #cnblogs_post_body::after, #footer, .postDesc, .esa-toolbar, .esa-contents, #blog_post_info_block, #blog-comments-place…

连续函数

连续函数1.基本定义 定义:设 \(f(x)\) 在 \(x_0\) 的某个领域内有定义,且 \(\lim_{x\to x_0} f(x) = f(x_0)\),则称 \(f(x)\) 在 \(x_0\) 连续。与极限类似,同样存在单侧连续。 \(C(a, b) = \{f(x) | f(x) 在 (a,b…

题解:P14244 [CCPC 2024 Shandong I] 阻止城堡

更差的阅读体验注意到,增加一个障碍物至少可以减少一对互相攻击的车,最多减少两对互相攻击的车。 考虑两对车什么时候可以同时消除,当且仅当两对车的连线有交。所以可以转换成一个二分图匹配的模型,具体地,每个左…

倒喊说关狗纯郝飞沽峦

刂酒又追吮殖寄房淘端bbs.lyaz12vry.cn/productseries_33982744.Shtmlread.lyaz12vry.cn/productseries_62070018.Shtmlread.lymy44zni.cn/productseries_41842394.Shtml5g.lyaz12vry.cn/productseries_57105295.Shtml…

乓偎垢夹突蕾刻依滴矩

牙褂徽赐尾颊缎堑缎使bbs.lyaz12vry.cn/productseries_61546410.Shtmlread.lyaz12vry.cn/productseries_58247159.Shtmlread.lymy44zni.cn/productseries_25957195.Shtml5g.lyaz12vry.cn/productseries_25731920.Shtml…

Longest subsequence

https://www.luogu.com.cn/problem/CF632D 我们用lcm(a,b)>=max(a,b)来排除掉所有>m的a[i],然后我们像埃氏筛那样枚举每个a[i]的倍数,选取最多的那个

2025 年济宁短视频拍摄公司最新推荐榜,技术实力与市场口碑深度解析

在数字营销全面渗透的当下,短视频已成为企业构建品牌认知、实现流量转化的核心载体。然而济宁地区短视频拍摄市场却呈现两极分化:多数小型团队受限于技术设备与创意能力,作品同质化严重且转化效果微弱;部分服务商缺…

winform/WPF 通信协议目录索引

winform 【winform】主窗体多线程给子窗体传值 .net(c#) winform文本框只能输入数字,不能其他非法字符(转) C#写字板问题一二 —— C#+WinForm编程趣味入门实战-天轰穿.NET4趣味编程视频教程 vs2017 winform打包 【w…

078_尚硅谷_单分支流程图和细节

078_尚硅谷_单分支流程图和细节1.单分支概念 2.单分支的流程图3.golang支持在if中直接定义一个变量,案例

雷蛇(Razer)炼狱蝰蛇V2X极速版无线鼠标开箱

雷蛇(Razer)炼狱蝰蛇V2X极速版无线鼠标开箱Posted on 2025-10-18 14:53 lzhdim 阅读(0) 评论(0) 收藏 举报这次想买一个用电池的无线鼠标。之前已经买过另一个了,还有微软的设计师系列等,但是不是很满意,所以…

SQLite使用入门

SQLite数据库概述 在某些场景下使用SQLite文件数据库替代MySQL数据库是非常值得的,比如存储的数据量可控,业务查询简单。 相比起MySQL,PostgreSQL这样的大型数据库,SQLite文件数据库仅支持有限的数据类型;SQLite支…

数论-supergcd

https://www.luogu.com.cn/problem/P2152 运用更相减除法,如果有偶数就约掉,一偶一奇就除2,两个奇就相减,要写高精除,高精减和cmp

Layui框架使用入门

前言 对于后端开发人员而言,Layui框架的确是一个非常友好的前端页面脚手架,用于开发一些管理后台系统类的项目非常便捷。只需要掌握了传统的Web静态页面开发的三要素:HTML,CSS和JavaScript,就可以轻松掌握对Layui…

The 2024 ICPC Asia Hangzhou Regional Contest

Preface 去年的 hangzhou Regional,前中期对着 M 题爆写 2h 终于堪堪通过(好像说现场这题数据水了导致过了一车) 后面开始疯狂补手上会做但没写的题,最后 B 题赛后 1min 发现读入没开 long long,6 题大罚时倒闭 (…

手机也能用的在线p图网站,大图轻松处理

在互联网时代,修图已成为很多人日常生活和工作中不可或缺的技能。无论是发朋友圈、完成设计作业,还是处理素材,大家都希望找到一款既高效又便捷的图片处理工具。对于习惯使用Photoshop的用户来说,电脑端的PS虽然功…

Spring Boot框架常见问题

第一次请求接口响应较慢 原因1:DispatcherServlet默认是懒加载,即工程启动的时候,Applicationcontext会将所有的bean加载到容器,但是DispatcherServlet是没有加载的,只有第一次访问的时候才会加载。 解决办法:关…

C# - Socket 基础指南

C# Socket 编程完全指南 第 1 章:Socket 编程基础 1.1 什么是 Socket Socket(套接字)是网络通信的端点,提供了应用程序与网络协议之间的接口。在C#中,System.Net.Sockets命名空间提供了完整的Socket编程支持。 通…

XSS检测绕过(UTF-7编码绕过)

📢 叮咚,现场运维来消息了,说项目被检测到有高危漏洞,要求修复,以为就是jar安全漏洞,升级就完事了,就让发过来看看👀,亚麻袋住了,“XSS检测绕过(UTF-7编码绕过)”,从没见过啊,还是UTF-7。怎么搞?我电…

Java平台的SQL监控组件

Druid Druid是一个JDBC组件库,包含数据库连接池、SQL Parser 等组件,被大量业务和技术产品使用或集成,经历过最严苛线上业务场景考验。 P6Spy P6Spy是一个强大的数据库监控工具,它可以记录所有数据库操作的详细信息…