QEMU 和路由器固件

逆向工程 linux 固件 奇木
2021-06-23 23:49:21

我正在尝试让路由器固件(二进制)在 QEMU 上运行(如果可能的话)。所有网络都设置良好,因为我已经使用 debian_wheezy_mips_standard.qcow2 对其进行了测试

sudo qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda MYROUTERBINARY.bin 
-append "root=/dev/sda1 console=ttyS0"-nographic

当我运行这个 QEMU 时会进入一个空白屏幕。我认为它可能没有用户界面,因为它是路由器,但是在针对它应该位于的 IP 地址空间运行 nmap 时我无法得到任何响应。

我应该使用以下方法导入文件系统:

sudo qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda
debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=ttyS0" -nographic

例如,假设我在路由器上运行了 netcat。我希望能够访问端口,因此需要运行路由器固件/文件系统

有人可以帮忙吗?

3个回答

大多数基于 MIPS/ARM 的路由器都有一个 ROM 引导加载程序,它会在设备开机时运行。这个引导加载程序通常可以通过串行端口访问,但有些平台(如 AR7)会做一些奇怪的事情,比如有一个 FTP 服务器(你可以通过它刷新固件)。

此引导加载程序将从 NAND 设备的分区加载内核映像和 initrd,然后运行它。

bin文件可能被设计为直接写入闪存分区,然后由引导加载程序解压缩/加载到 RAM 中。有更多的分区,而不仅仅是包含内核的分区,您将有一个可能包含 initrd 或 rootfs,还有一个充当“NVRAM”或保存设置。甚至可以持有引导加载程序本身。

Linux 运行后,固件升级通过写入/dev/mmcbllkpX设备进行。

您可以通过找出设备上的哪些闪存分区是内核和 initrd 并使用 QEMU-kernel-initrd选项加​​载它们来解决引导加载程序问题

但固件仍可能将所有原始闪存作为其预期设备的一部分。这是您将遇到严重问题的地方。

我不知道如何让 QEMU 模拟 NAND 设备,或者它是否可能(它与磁盘设备不同)。大多数路由器都有一个“分区”的单个 NAND 设备,Linux 内核将它们重新创建为/dev/mmcblkp0/dev/mmcblkp1等。要尝试重新创建设备的原始环境,您确实需要将完整的 NAND 转储和分区,就像它在芯片上一样。

还有一个问题,如果路由器不是基于 Linux 的,它可能只能与路由器中的特定硬件设备配合使用。

您可能需要先解压 bin 文件(使用 binwalk 之类的工具)。我认为您不能将 .bin 作为 hda 引用。通常,解压 .bin 文件后,您将获得设备的文件系统。您有几个不同的分区,因为一些路由器制造商会创建一个跨多个模型共享的主文件系统,然后创建较小的模块以加载到特定于模型的设备中。如果您查看根 fs 的 init,您应该能够看到 .bin 中的其他分区如何移动并模仿它。

就我个人而言,我从未尝试过模拟整个设备,我发现能够解压缩 .bin 并将其 scp 到 wheezy_mips hda 并尝试自己运行路由器的一部分是更有价值的。此外,我认为您会遇到网络问题。模拟 wheezy_mips hda 很容易,请记住,您的 .bin 旨在加载到具有多个网络接口的环境中,

-祝你好运。

sudo qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda MYROUTERBINARY.bin -append "root=/dev/sda1 console=ttyS0"-nographic

你会使用bin文件的设备有分区吗?我将添加作为最后的声明 --no-acpi。它应该这样做。当您运行 qemu 系统时,该部分非常重要。或者你正在解释的症状会发生。