HDD固件破解 第一部分

Lobsters Hottest 工具

摘要

作者详细描述了如何通过硬件和软件技术,在没有AI辅助的情况下,对HDD固件进行转储、分析和修改,以实现Xbox 360的延迟利用。

<p><a href="https://lobste.rs/s/x3jzgx/hdd_firmware_hacking_part_1">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/05/14 16:33

# HDD 固件破解 第一部分 来源:https://icode4.coffee/?p=1465 去年某段时间,我正在为 Xbox 360 开发一个漏洞利用(后来演变成备受期待的软破解),我需要一种方法来修改硬盘固件,以尝试利用一个竞态条件。这让我一头扎进了手头几款不同品牌硬盘和固态硬盘的固件修改研究中。在本系列博客文章中,我将涵盖我所做的所有工作,包括:固件的转储与分析、通过 JTAG 对硬盘进行实时调试、修改硬盘固件,以及我如何利用 AI 辅助分析并识别一个未知的 MCU 架构。第一篇文章将聚焦于转储、分析和修改硬盘固件。本文中的所有工作均未借助 AI 完成。在下一篇文章中,我将介绍如何利用 AI 对其他硬盘/固态硬盘进行类似工作,以及如何用 AI 对未知 ISA 进行黑盒逆向工程,并让 Claude 访问我的硬盘以进行调试。 ### 背景 我试图利用的漏洞是一个竞态条件,发生在主机从硬盘读取数据时。我需要从读取请求发出到硬盘回复之间的特定时间窗口,才能使漏洞成功触发。当时我并未完全理解所有相关变量,因此在硬盘响应时间内利用竞态条件遇到了困难。我的最初想法之一是修改硬盘固件,当从硬盘读取特定扇区时引入几百毫秒的延迟,从而为漏洞触发提供足够的时间。 多年来,我读过一些关于修改硬盘固件的文章,但没有一篇能让我直接上手使用。尽管如此,我知道这个概念并不新鲜,只需找到一块容易操作的硬盘即可。当时我只需要一块硬盘来完成 Xbox 360 漏洞的开发,之后再考虑将固件修改扩展到其他品牌和型号。后来事实表明,我找到了其他方法来微调竞态条件攻击,最终完全不需要修改硬盘固件。 从攻击者和渗透测试的角度来看,修改硬盘/固态硬盘固件的想法非常吸引人。然而,我以前从未愿意深入这个领域,因为嵌入式设备通常在底层非常复杂,逆向工程会耗费大量时间。你知道硬盘是如何工作的吗?从高层来看,当然知道:磁盘高速旋转,磁头读取数据。但你*真的*了解它们在微控制器层面是如何工作的吗?我之前对硬盘内部工作原理一无所知,但我知道自己找到了另一个漏洞,而失败是我无法接受的选项。如果阻挡我利用这个漏洞的唯一障碍是一块硬盘,那么这块硬盘必须被攻克。 ## 测试对象 对于这个漏洞,我只需要任何一块容易获取、修改并能重新刷写固件的硬盘或固态硬盘。不过,我主要关注 Xbox 360 所使用的硬盘品牌,因为使用该漏洞的人很可能手头已经有一块这样的硬盘。我还拿了几块西数硬盘,因为根据以往经验,它们有一些后门厂商命令,可以用来获取底层访问权限。最后,我还拿了几块三星固态硬盘,因为我手头正好有一些。 以下是勇敢的测试对象,它们(希望)能在我即将进行的实验中幸存下来: 以下是型号,供有兴趣的人参考: - Samsung HM020GI - Hitachi HTS545032B9A300 - Western Digital WD3200BEVT - Samsung PM871a 你可能注意到其中一块硬盘被彻底“羞辱”了,这是因为之前的一些不幸经历:它先是被用在了一个故障的 USB 适配器上,然后又用在一台有故障 SATA 通道的电脑上,结果可想而知……但硬盘本身其实功能正常。 ### 启动 我做的第一件事是在网上研究这些硬盘型号,看看能否找到固件转储文件以及前人留下的任何信息。我花了不少时间阅读 HDD Guru (https://forum.hddguru.com/) 论坛,找到了大量关于西数硬盘和日立硬盘的信息。我还找到了 MalwareTech (https://www.malwaretech.com/2015/04/hard-disk-firmware-hacking-part-1.html) 的一个系列博客,他在其中尝试修改硬盘固件,其中有一段话与我的研究产生了强烈共鸣: > 在开始破解之前,我决定先阅读别人的研究成果,以了解该从何入手。很机智吧?但事实上,我所依据的大部分研究要么是错误的,要么根本不适用于我手头的这块硬盘。 这正是我的经历。我找到的大多数信息都是 15 年以上的论坛帖子,要么不正确,要么不适用于我手头的硬盘型号。然而,我收集了大量“碎片”信息,它们拼凑在一起开始形成一幅更大的图景。我对每块硬盘的攻击计划如下: 1. 获取固件转储——要么在线找到固件镜像,要么自己从硬盘中转储。 2. 将固件加载到 IDA 中进行分析,这还包括处理遇到的任何压缩或加密。如果无法分析固件,基本上就不可能对其进行修改。 3. 找到一种方式将修改后的固件刷写回去。这可以通过手动编程硬盘逻辑板上的闪存芯片,或者使用标准/后门命令来完成。如果不能写回修改后的固件,这块硬盘就立刻被排除。 4. 分析固件,尝试找到处理读取请求的代码。我感兴趣的命令是 DMA READ EXT,这是主机用于读取请求的命令。在固件的某处,很可能存在某种命令处理函数表,用于处理硬盘支持的各种 ATA 命令。找到这个表要么能直接带我找到 DMA READ EXT 命令处理函数,要么能给我一个起点来追踪并找到它。这可能是整个过程中最困难的部分。 5. 编写一些补丁,当从硬盘读取特定扇区时,引入几百毫秒的延迟。 6. 将修改后的固件刷写回硬盘。 ## 获取硬盘固件 我在 HDD Guru 论坛上发现了一个区域,人们会上传使用 PC-3000 获取的各种硬盘固件转储。如果你不熟悉 PC-3000 (https://www.acelab.eu.com/catalog/),它是一个专业级的数据恢复工具,使用专有厂商命令来诊断和修复硬盘,以及从硬盘中转储固件。我在论坛上找到了西数硬盘的固件转储,并且在 Twitter 上发布相关内容后,有人联系我,他们能够使用他们有权访问的 PC-3000 获取 Samsung HM020GI 的固件转储。 我还在联想网站上找到了 Samsung PM871a 固态硬盘的固件,作为固件更新工具的一部分,这实际上是一举两得。我不仅得到了固件镜像,而且通过逆向分析更新工具,还能找出将新固件刷写到硬盘所需的命令。我从未找到日立硬盘的固件,但手头的这些已经足够开始工作了。 ### 西数硬盘 从西数硬盘开始,我在 HDD Guru 论坛上找到了关于固件镜像格式的一些信息,在十六进制编辑器中看了几分钟后,我弄清了以下内容: 固件镜像的结构 这种格式非常直接,基本上就是一个平面文件,包含一系列基于静态地址的可执行/数据段,开头是段头。此外,每个段头和数据块都有自己的校验和(8 位累加和),用于验证数据是否有效/复制正确。 我编写了一个快速的 IDA 加载插件,以便加载固件镜像并开始分析。这时我意识到,除了第一个段之外,镜像中的所有其他段都是压缩的。我在论坛上找到的一个“碎片”信息是:第一个段是一个加载器存根,MCU 引导加载程序使用它来解压缩并将剩余段加载到内存中。然而,发帖者并未提及压缩算法是什么。 起初,我通过一些工具运行一个压缩块,试图识别压缩算法,但没有得到任何有效结果。于是,我将第一个段作为 ARM 代码加载到 IDA 中,并开始逆向分析其工作原理。为硬盘/固态硬盘供电的许多 MCU 都是基于 ARM 架构的,并且其中许多具有多个核心,负责不同的任务。幸运的是,这块西数硬盘只有一个 ARM 核心,这使得处理起来稍微容易一些。 经过几分钟的逆向分析,我标记出了大部分段加载循环,并识别出了负责解压缩数据的函数: 段加载函数的反汇编 我花了一些时间逆向分析解压缩例程,最终实现了它的工作版本。该算法是 LZHUF,但做了一些改动,这就是为什么当我通过识别工具运行压缩块时无法检测到它。N 常量从 2048 改为 4096,并且运行长度计算现在是减去 THRESHOLD 而不是加上: LZHUF 算法修改示例 更新了我的 IDA 加载脚本后,我成功地将整个固件镜像加载到正确的基地址处。西数固件现在已准备好进行分析。 ### Samsung PM871a 接下来是 Samsung PM871a,我在联想网站上找到了它的固件和一个固件更新工具。这实际上是一个很好的策略:在 OEM 网站上搜索固件更新工具,可以得到固件和更新工具,而该工具会: 1. 如果固件受到保护,则将其解密/去混淆。 2. 将其刷写到硬盘中。 三星固态硬盘的固件通常会以某种方式进行加密/混淆,而固件更新工具通常在将固件发送到硬盘进行刷写之前会对其进行解密/去混淆。对于我处理的这款特定固态硬盘,固件使用某种位操作算法进行了混淆,我能够从固件更新工具中逆向分析出该算法: ```cpp void DecodeFirmware(unsigned char* pBuffer, unsigned int Length) { // 遍历整个固件缓冲区。 for (unsigned int i = 0; i < Length; i++) { // 获取高四位。 unsigned char nibbleHi = (pBuffer[i] >> 4) & 0xF; // 进行位操作? if ((nibbleHi & 1) != 0) nibbleHi >>= 1; else nibbleHi = 0xF - (nibbleHi >> 1); // 屏蔽并写入新的高四位值。 pBuffer[i] = (pBuffer[i] & 0xF) | (nibbleHi << 4); } } ``` 这个特定的固件更新工具可用于 20 多种不同的三星固态硬盘型号(以及几十种不同的 DVD 驱动器型号),因此从这些工具中收集信息对于向外扩展研究工作非常有益。 接下来,我在十六进制编辑器中打开去混淆后的固件镜像,以了解它的结构。我注意到的第一件事是文件前几 KB 中一些可疑的数据,看起来像是某种加密签名(这意味着我可能无法修改固件)。然而,通过比较两个固件文件,除了数据和代码中的一些微小更改外,唯一明显的区别是文件开头的一段 28 字节的数据: 两个固件文件的比较 虽然这不能下定论,但这是一个很好的迹象,表明固件文件很可能没有使用像 RSA 或 ECDSA 这样强大的公钥加密算法进行签名。值得一提的是,这两个固件文件实际上是同一版本,但属于不同形态的 Samsung PM871a,一个是 2.5 英寸 SATA 型号,另一个是 M.2 型号。因此,尽管文件中有一些更改,但仍有可能部分内容确实经过了签名。28 字节的长度对于哈希或签名来说有些奇怪,可能是 SHA-224 或截断的 SHA-256,但这可以稍后再担心。 下一步是尝试找出段头的位置(如果有的话)。将文件作为二进制文件加载到 IDA 后,我立刻就能看出文件被分成了具有不同基地址的段,因此我们需要找到段头才能正确加载它。文件的前 8 KB 看起来是一些元数据块,之后我们可以看到: 疑似段描述符的十六进制转储 红色标记的字节几乎肯定是代码/数据段的内存地址,我怎么知道的?因为我已经盯着十六进制编辑器这个“深渊”看了 20 多年,非常擅长剖析二进制文件格式。此外,这些地址与 ARM Cortex-M3 核心的内存映射非常吻合: ARM Cortex-M3 内存映射 又盯着“深渊”看了几分钟后,我弄清楚了每个段的偏移量和大小都是以 16 KB 块为单位的。在编写了另一个 IDA 加载脚本后,我成功将固件完全加载并准备好进行分析。 ### Samsung HM020GI 最后是 Samsung HM020GI。在十六进制编辑器中查看该硬盘的固件转储,我可以清晰地看到纯文本字符串和看起来像机器码的内容。然而,尽管我尽了最大努力,还是找不到任何能反汇编出这些代码的架构。一个突出的现象是整个文件似乎被进行了字翻转: 字节翻转的固件数据 这开始让我觉得这可能是一种极其深奥的 ISA,甚至是自定义的字节码,需要在 MCU 内置的虚拟机中运行。目前我决定将这块硬盘搁置一边,但在第二部分我们会再回来讨论,敬请期待! ## 刷写修改后的固件 从现在开始,我将只介绍我在西数硬盘上的工作,因为这是我花费时间最多的硬盘。如果我对每块硬盘重复相同的步骤,对于读者来说也会显得乏味。其他硬盘将在第二部分回归,届时我将介绍对每块硬盘进行的独特研究,但我们现在先将其搁置。 向硬盘写入新固件主要有三种方式: - 使用 DOWNLOAD MICROCODE ATA 命令,这是最常见的方式,大多数(如果不是所有)硬盘都支持。 - 后门厂商命令,通常用作维修/诊断手段,或者用于主要使用服务区覆盖层来修补/更新固件的硬盘。 - 通过硬盘电路板上暴露的串行接口,通常用作维修/诊断手段。 ### DOWNLOAD MICROCODE 命令 所有硬盘和固态硬盘都使用某种版本的 ATA 规范与主机设备通信,该规范概述了通信过程中使用的所有命令和响应。这些命令包括读取和写入数据、查询和设置驱动器信息等。其中一个命令是下载微码命令,用于将新代码/固件上传到驱动器。通常,你发送该命令时附带一些额外的寄存器值来指示固件大小,将新固件流式传输到驱动器(可以是分块传输或通过 DMA 传输),然后驱动器可能会验证接收到的固件并将其写入非易失性存储器。

相似文章

修复我的吉他音箱固件

Lobsters Hottest

作者通过UART和JTAG逆向工程了Yamaha THR10c吉他音箱的固件,转储并修补了它,以修复旁路增益问题,并构建了一个API。

无需触碰,通过音箱入侵你的电脑

Hacker News Top

一位安全研究人员对 Creative Sound Blaster Katana V2X 的固件进行了逆向工程,发现了漏洞,攻击者可在15米范围内将音箱变成隐蔽的窃听工具和无需物理接触的 Rubber Ducky。