TheMalwareGuardian/CVE-2025-70330

GitHub: TheMalwareGuardian/CVE-2025-70330

一个通过逆向旧版软件教授初学者如何发现文件解析漏洞并获取首个CVE的完整教育案例。

Stars: 0 | Forks: 0

# ***🧩 CVE-2025-70330: Easy Grade Pro 4.1 文件解析漏洞***

一个旨在向初学者展示从起步阶段即可通过逆向工程进行漏洞研究的教育示例。

## ***📑 目录***
## ***🎓 本仓库为何存在*** 本仓库的存在是为了满足一个需求:提供一个简单的示例,用于教导那些刚开始涉足漏洞研究,特别是对逆向工程感兴趣的初学者。 在完成与二进制利用或二进制分析相关的课程、培训或硕士项目后,许多学生感觉真正的漏洞研究似乎远超他们的水平。他们通常将逆向工程与内核漏洞、浏览器利用、固件研究或复杂的现代目标等非常高级的主题联系在一起,因此认为自己还未准备好。实际上,问题不在于知识的匮乏,而在于缺乏一个现实的起点。 我希望通过一个示例展示:利用基础课程中学到的技能,已经可以拿过一个真实的程序,理解其工作原理,触发崩溃,并识别出一个真实的 Bug。 本仓库正是这样一类示例。它不是关于寻找复杂的漏洞,而是为了展示初学者可以从一些小型、可复现且易于理解的事物入手,并且依然是在进行真正的漏洞研究。
## ***🧭 与“通往首个 CVE 之路”的关系*** 本仓库与我的演讲 **“[通往首个 CVE 之路](https://github.com/TheMalwareGuardian/The-Path-That-Leads-to-Your-First-CVE)”** 直接相关,我在其中解释了进入漏洞研究世界有多种途径,每个人通常会根据自己的兴趣最终走上不同的道路。 有些人从源码审计开始,有些人从逆向工程开始,有些人从 Web 安全开始,还有些人从技术研究开始。所有这些路径都是有效的,但重要的是要理解,每个领域都有适合初学者的切入点。 初学者路径的示例包括: - 在源码审计中,审查小型开源项目。 - 在逆向工程中,处理逻辑简单的遗留应用程序。 - 在 Web 应用程序安全中,分析简单的 Web 应用或旧的 CMS 插件。 - 在技术研究中,研究设计时未考虑安全性的协议或软件。 - 以及许多其他类似的起点。 这类目标看起来可能很基础,但它们教授的核心技能与日后处理复杂系统时所需的技能是相同的。 本仓库代表了逆向工程领域中那些初学者路径之一。 这里记录的漏洞是通过分析一个旧应用程序、理解其文件格式的解析方式,并识别出一个导致崩溃的编程错误而发现的。其本身的影响并不复杂,但这个过程是真实的、可复现的,并且对于学习漏洞研究的实际运作方式非常有用。 这就是我在解释“通往首个 CVE 之路”时使用的示例类型,旨在展示逆向工程是一条从一开始就有效的路径,而且从简单目标开始不仅是可以接受的,往往也是最好的学习方式。
## ***🧱 为何旧软件是学习的绝佳素材*** 当你刚刚起步时,现代应用程序通常过于复杂。它们使用了各种保护措施、缓解机制和代码库,在没有大量经验的情况下很难理解。旧软件则不同。 遗留应用程序在编写时并未考虑现代安全实践。它们通常包含简单的解析错误、不安全的内存操作和逻辑错误,这些都可以通过基础的逆向技能来理解。这使它们成为学习的绝佳素材。 通过一个旧程序,你可以:逆向二进制文件、理解文件格式、触发崩溃、分析崩溃、定位 Bug、记录问题并报告漏洞。换句话说,你学到了每位漏洞研究人员所需的基本技能。 这正是本示例的意义所在。
## ***🧪 为何此示例至关重要*** 此示例之所以重要,是因为它展示了一个非常简单的道理: - 你不需要成为专家才能开始。 - 你不需要利用操作系统内核或浏览器。 - 你可以从简单的事情开始,理解它,记录它,并依然产出真实的成果。 如果你喜欢逆向工程,你可以从一开始就沿着这条路走下去。掌握它可能需要数年时间,但你不需要等上几年才能开始做真正的工作。
## ***⚠️ 关于漏洞*** 该漏洞([CVE-2025-70330](https://nvd.nist.gov/vuln/detail/CVE-2025-70330)))影响 Easy Grade Pro 4.1 在加载专有 .EGP 成绩单文件时的文件解析逻辑。 应用程序通过从文件中读取固定位置的字段来重建内部成绩单结构,并将这些值用作已加载文件缓冲区内的偏移量。这些偏移量随后被用于计算内存大小以及将数据复制到动态分配的缓冲区中。 在正常情况下,文件会在解析继续之前通过几项结构检查。然而,一旦这些检查成功,解析器就会信任存储在文件中的偏移量值,而不去验证它们是否保持在已加载缓冲区的范围内。 通过修改原本有效的 .EGP 文件中的特定字节,可以破坏这些内部偏移量的计算。当解析器随后使用这些值时,它会尝试读取有效文件区域之外的内存,从而导致访问冲突和应用程序崩溃。 这种情况对应于越界读取([CWE-125](https://cwe.mitre.org/data/definitions/125.html)),导致在打开特制文件时出现本地拒绝服务。
## ***🔬 技术分析*** .EGP 文件格式使用基于偏移量的方法进行解析。解析器不是顺序处理文件,而是读取包含起始和结束偏移量的内部结构,这些偏移量描述了特定数据块在文件中的位置。 这些偏移量用于计算内存区域的大小,并将数据从已加载的文件缓冲区复制到新分配的内存中。 易受攻击的逻辑可以概括为: ``` size = offset_end - offset_start + 1 buffer = calloc(1, size) memcpy(buffer, file_buffer[offset_start - base_offset], size) ``` 一旦文件通过了初始验证检查,解析器就假定存储在文件中的偏移量是有效的。没有执行任何验证来确保计算出的源指针保留在已加载的文件缓冲区内。 如果偏移量以受控方式被篡改,解析器可能会尝试读取有效区域之外的内存,从而导致 memcpy() 操作期间发生访问冲突。
### ***💥 为何仅特定的畸形文件会导致应用崩溃*** 并非每个畸形的 .EGP 文件都会触发崩溃。 解析器在到达易受攻击的代码路径之前会执行几项一致性检查。 如果文件结构损坏过于严重,应用程序会提前停止解析并报告成绩单已损坏。 然而,某些修改使内部结构保持足够的一致性以通过初始检查,但稍后在解析过程中仍会产生错误的偏移量值。 当这种情况发生时,解析器会到达更深层的例程,在这些例程中这些偏移量被信任并用于内存复制操作,最终导致越界读取。
### ***🧾 概念验证*** 可以通过修改有效的 .EGP 文件并在特定偏移处插入受控数据来触发崩溃。 概念验证的工作原理如下: 1. 获取一个由 Easy Grade Pro 生成的有效成绩单文件。 2. 将文件作为原始二进制数据读取。 3. 在固定偏移处插入一段字节序列。 4. 保存修改后的文件。 5. 在应用程序中打开该特制文件。 PoC 中使用的示例参数: - 注入偏移:548 - Payload 大小:21 字节 - Payload 值:0x41 ("A") 此修改使文件在结构上保持足够的有效性以通过初始检查,但破坏了解析器稍后使用的内部偏移量计算,最终导致应用程序崩溃。
### ***💣 崩溃行为*** 当在调试器下打开畸形文件时,应用程序在内存复制操作期间崩溃。 观察到的异常是由无效内存读取引起的访问冲突。 在调试过程中,memcpy() 使用的无效指针源自从解析的文件结构派生的偏移量计算。当这些偏移量引用已加载文件缓冲区之外的内存时,源指针会指向一个未映射的地址,从而导致崩溃。 这证实了该漏洞是由文件解析期间缺失边界验证引起的。
### ***📌 备注*** 该漏洞影响一个已停止生命周期且供应商不再维护的产品。 该问题被记录用于教育和研究目的,并为初学者提供一个具体示例,说明如何逐步分析软件以理解 Bug 是如何出现的,以及真正的漏洞是如何被发现的。
标签:CVE-2025-70330, Easy Grade Pro, PoC, 二进制分析, 二进制漏洞, 云安全运维, 云资产清单, 初级安全, 域名收集, 情报收集, 教育示例, 文件解析漏洞, 暴力破解, 漏洞复现, 漏洞研究, 缓冲区溢出, 误配置预防, 软件开发缺陷, 逆向工具, 逆向工程