通过 mtdblock 设备转储固件

逆向工程 固件 嵌入式 倾倒
2021-07-03 01:12:40

这是我第一次尝试做一些逆向工程。我正在尝试从 huawei hg523a TalkTalk 路由器上转储文件系统。

问题在于设备上的程序数量非常有限。以下是我可以使用的程序列表。

BusyBox vv1.9.1 (2012-03-05 00:16:52 CST) multi-call binary
Currently defined functions:
        [, [[, arp, ash, cat, chmod, chown, cp, date, echo, ftpget,
        ftpput, halt, ifconfig, init, kill, killall, linuxrc,
        ln, ls, mcast, mkdir, mknod, mount, netstat, nslookup,
        ping, poweroff, ps, reboot, rm, route, sh, sleep, test,
        top, traceroute, umount, vconfig, wget

所以我试图将文件系统提取到另一台 linux 机器上,以便我可以更轻松地完成它。我可以使用 ftpput 命令上传单个文件。

cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00010000 00001000 "boot"
mtd1: 00001000 00001000 "flag"
mtd2: 003c0000 00001000 "main"
mtd3: 0002d000 00001000 "config"

我想要做的是上传 mtdblock0-3,然后将其安装在我的另一台机器上以探索文件夹结构等。从 /proc/mounts 看起来它是一个 squashfs 文件系统。

cat /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / squashfs ro 0 0
none /dev tmpfs rw 0 0
/proc /proc proc rw 0 0
none /var tmpfs rw 0 0
none /tmp tmpfs rw 0 0
none /mnt tmpfs rw 0 0

所以基本上我上传了 mtdblock0。

ftpput -s -v -u james -p password -l /dev/mtdblock0 -r ftpdir/mtdblock0 192.168.1.64

并将其安装在另一台计算机上:

root@kali:~/Desktop/talktalk/blocks# mount -t squashfs mtdblock0 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

任何人都可以指导我朝着正确的方向前进,以了解我可能做错了什么?所以不可能以这种方式传输文件系统?

预先感谢您的帮助。

3个回答

正如 /proc/mtd 中的名称所暗示的,mtd0 可能不是文件系统,而更有可能是引导加载程序。同样,mtd3 的名称表明它包含保存的配置设置(管理员密码、无线设置等)。

mtd1 和 mtd2 的“标志”和“主要”名称分别有点含糊不清,但由于名称和大小,我希望 mtd2 包含文件系统。它也可能包含Linux内核,因此文件系统可能不会在mtd2开头启动;一旦您 ftp 关闭了 mtd2 的副本,您就必须找到文件系统的开头并将其删除以提取/挂载它。

附带说明一下,如果您找到 squashfs 文件系统后,您的 Linux 主机无法挂载它,请不要感到惊讶。有许多破解版本的 squashfs,您可能需要为该特定版本找到合适的 squashfs 工具并在图像上运行 unsquashfs 以提取文件。

我通过 devttys0 的评论找到了解决方案。

mtdblock2 包含文件系统。这一点很明显,因为它的尺寸比其他 mtd 设备大。我 ftpd 这个文件,然后我下载了固件模块工具包,它有一个脚本,它遍历所有 unsquashfs 版本并尝试提取固件。在这种情况下,它使用版本 quashfs-3.2-r2-hg612-lzma 工作。

您可以/proc/mtd为确切的“图像”做 cat

cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 01000000 00001000 "whole_flash"
mtd1: 00020000 00001000 "bootloader"
mtd2: 00060000 00001000 "userconfig"
mtd3: 004c0000 00001000 "filesystem1"
mtd4: 00300000 00001000 "kernel1"
mtd5: 00300000 00001000 "kernel2"
mtd6: 004c0000 00001000 "filesystem2"