前言

本篇将通过例题形式学习 Ext3 文件系统的分区恢复、文件恢复

你可以在 https://winhex.im0o.top/ 中查看所有例题文件

总览

  • 实例:恢复严重被破坏分区的 Ext3 文件系统

  • 实例:从底层恢复 Ext3 文件系统中的文件

实例:恢复严重被破坏分区的 Ext3 文件系统

涉及知识点

  • Ext3 文件系统的超级块结构

  • Ext3 文件系统的块组描述符表结构

  • 从备份超级块恢复 Ext3 文件系统的 0 号超级块

恢复要求

恢复根目录下的文件 Jay_Hicks_6194.png

附加磁盘文件、使用 Winhex 打开磁盘

导入题目后可以从 计算机管理 —— 磁盘管理 中看到该虚拟磁盘显示位 “没有初始化”,其大小为 150GB,均未分配分区,可以初步判断该虚拟磁盘的 MBR(主引导扇区)损坏。

使用 Winhex 打开虚拟磁盘后开始进行数据恢复。

寻找分区

向下搜索 !00,在 2050 扇区处找到数据

通常情况下 第一个分区的位置 通常第一个分区的起始位置为 0(USB-FDD)、63、1024、2048、4096 会出现在 63 扇区 或 2n 扇区 处

搜索到的数据位置为 2050 扇区,初步判断所在分区为 ext3/ext4 分区(因为 ext3/ext4 的 0 号超级块相对于分区起始间隔 2 扇区)

确定分区为 ext3/ext4 分区

向前跳转至 2048 扇区后向后跳转 262144 扇区(通常一个块组的大小)可以发现 1 号超级块的数据

图片中选定的部分为“当前超级块编号”

现在可以确定当前分区为 ext3 分区

将备份超级块复制至 0 号超级块位置

选中超级块扇区数据,将其复制至 2050 扇区处

修改数据中的 当前超级块所在块组 为 0。

计算分区大小,填写分区表

本部分与 实例:恢复损坏 0 号超级块的 Ext3 文件系统 步骤相似

查看超级块中的 总块数,计算分区大小,填写分区表。

总块数 * 每块扇区数 = 分区大小

该分区数据为

分区类型 分区起始位置 分区大小
83 2048 314570752

填入 MBR 后,保存后重新打开磁盘,可以发现分区已经恢复。

打开分区后发现分区被损坏,无法正常打开

排查故障

从 0 号块组起始向后跳转 8 扇区到达 块组描述符表 位置

由图中所示,块组描述符表损坏,数据变成了 FF

修复块组描述符表

从备份超级块中寻找块组描述符表 将其复制至 0 号超级块

计算块组描述符表的大小

在这之前,我们需要得知 块组描述符表 的大小

通常情况下,每个块组描述符能表示至多 32768 个块,块组描述符表包含了所有块组描述符

Ext3 文件系统的块组描述符分析 > 通过块组描述符计算分区大小 处解释过块组描述符表可以表示分区大小

并且,可以通过块组描述符表计算分区大小

在这里,我们已知分区总块数,逆推教程中计算分区大小的方法,我们可以算出 分区有多少个块组块组描述符的个数

从超级块得到分区总块数为 39,321,344

总块数 / 32768(每块扇区数) 得到 块组数 为 39,321,344 / 32768 = 1199.992

由于 最后一个块组不一定满 32768 块 所以该分区的块组数量为 1200 块组

所以 块组描述符 的个数为 1200

在 块组描述符表 中,每个块组描述符的大小为 32 字节,由此可以计算出 块组描述符表 的字节大小

块组描述符个数(即块组数量)* 32 字节 得到 块组描述符表 的大小(字节)

1200 * 32 = 38,400 字节

从备份超级块的块组描述符恢复数据

跳转至 1 号超级块后向后跳转 8 个扇区 前往 1 号超级块的 块组描述符表

选中数据,从起始位置向后跳转 38400 字节

如果跳转至此处发现后面还有块组描述符数据,说明 块组描述符表 的数据不是连续存储的,中间包含了 碎片数据

忽略碎片数据,拼接 块组描述符表 的数据并复制至 0 号超级块的 块组描述符表 数据区处

修复故障,保存并打开分区

保存后从 Winhex 打开分区,可以发现分区已经成功恢复

恢复文件

从目录浏览器中找到目标文件 Jay_Hicks_6194.png 将其恢复。

flag{ZFXI5jCy}

实例:从底层恢复 Ext3 文件系统中的文件

涉及知识点

  • Ext3 文件系统的块组描述符表结构

  • Ext3 文件系统的 i-节点 结构

  • Ext3 文件系统的目录项结构

恢复要求

恢复 /GIF/Steve_Kennedy_2941.gif 文件

附加磁盘文件、使用 Winhex 打开磁盘

导入题目后可以从 计算机管理 —— 磁盘管理 中看到该虚拟磁盘显示位 “没有初始化”,其大小为 30GB,均未分配分区,可以初步判断该虚拟磁盘的 MBR(主引导扇区)损坏。

使用 Winhex 打开虚拟磁盘后开始进行数据恢复。

寻找分区

向下搜索 !00,在 2056 扇区处找到数据

由图中数据可以看出该部分为 ext3/ext4 分区的 块组描述符表

0 号超级块 与 块组描述符表 的间隔为 8 个扇区,所以分区的起始位置为 2056 - 8 = 2048 扇区

尝试修复分区

向后跳转多次 262144 扇区,尝试寻找超级块备份,但是没有找到,于是尝试手动提取文件

本题主要的目的就是手动恢复文件,虽然也可以通过寻找备份恢复的方法恢复分区

手动提取文件

手动提取 ext3/ext4 文件系统中的文件的大致步骤为

块组描述符 => i 节点 => 目录 => i 节点 => 文件

寻找根目录的 i-节点

已知文件位于分区 根目录/GIF/ 下,所以从根目录开始寻找

根目录的 i-节点位于 0 号块组

从块组描述符表中找到 0 号块组的块组描述符的 i-节点表 的起始位置

从分区起始位置向后跳转 1,027 * 8 = 8216 扇区,找到 0 号块组的 i-节点表

根目录的 i-节点位于 2 号 i-节点

跳转至根目录的数据区

从 根目录的 i-节点 的直接块指针中找到根目录的数据区的起始位置

得出根目录的位置位于分区起始相对向后 1539 * 8 = 12312 扇区

跳转至根目录的数据区,寻找 GIF/ 目录的 i-节点号

GIF 目录的 i-节点号为 00 01 80 0198,305 号 i-节点

跳转至 GIF 目录的数据区

如果已知一个 i-节点号,就可以计算出该 i-节点所在块组,计算方法为 (i-节点号 −1)/ 每块组 i-节点数

计算得出 GIF 目录的 i-节点所在块组为 98,305 - 1 = 98,304 ,每块组 i-节点数为 8,192 ,所以 GIF 目录的 i-节点所在块组为 98,304 / 8,192 = 12 号块组

如果计算得出的数据带有小数,可以向下取整。对 (i-节点号 - 1) MOD 8192 (取余数)即可计算出该 i-节点在块组中的相对位置

本题没有小数,所以直接计算得出 GIF 目录的 i-节点所在块组为 12 号块组的第 1 个 i-节点

从块组描述符表中找到 12 号块组的块组描述符的 i-节点表 的起始位置

跳转至 12 号块组的 i-节点表,找到 GIF 目录的 i-节点

从 GIF 目录的 i-节点 的直接块指针中找到 GIF 目录的数据区的起始位置为 393,730 号块

393,730 * 8 = 3,149,840 扇区

跳转至 GIF 目录的数据区,寻找 Steve_Kennedy_2941.gif 文件的 i-节点号

Steve_Kennedy_2941.gif 文件的 i-节点号为 00 01 80 0398,307 号 i-节点

跳转至 Steve_Kennedy_2941.gif 文件的 i-节点

使用同样的方法计算得出 Steve_Kennedy_2941.gif 文件的 i-节点所在块组为 12 号块组的第 3 个 i-节点

跳转至 12 号块组的 i-节点表,找到 Steve_Kennedy_2941.gif 文件的 i-节点

分析 Steve_Kennedy_2941.gif 文件的数据区

从 Steve_Kennedy_2941.gif 文件的 i-节点 的直接块指针中找到该文件的数据区的起始位置为 106,052 号块,直至 106,063 号块均为该文件的数据区

i-节点的直接块指针有 12 个,大于 12 个的数据区的起始位置需要通过间接块指针来找到

该文件的间接块指针的起始位置为 100,365 号块,第二个间接块指针的起始位置为 100,366 号块

可以判断,该文件的间接块指针的数据是连续的

前往文件 Steve_Kennedy_2941.gif 的间接块指针

跳转至 100,365 号块,查看间接块指针的数据

观察间接块指针中的连续数据,如果两个间接块指针之间的数据不是连续的,那么该文件的数据区就不是连续的;

即目标文件包含碎片数据,需要将碎片数据合并才能得到完整的文件

通过观察间接块指针数据中的直接块指针,或使用 Winhex Script 自动查找每段连续的指针数据,得出该文件的碎片分布情况如下:

106052 -> 106067
108465 -> 108479
108833 -> 108863
106913 -> 106975
108929 -> 109055
111253 -> 111507
112129 -> 112639
113665 -> 113675

前往文件 Steve_Kennedy_2941.gif 的数据区,恢复文件

将以上得出的碎片数据 * 8 换算为扇区单位,得出 8 个碎片的起始位置和结束位置

将 8 个碎片的数据导出为文件,使用 Winhex 的 文件合并 功能将 8 个碎片合并为一个完整的文件

你可以在 使用 Winhex 进行数据恢复(19) 中找到详细的碎片文件恢复教程

参考答案

flag{hLRK9n39}