如何准确虚拟化定制硬件?

逆向工程 硬件 虚拟机
2021-07-04 13:20:53

这是我的情况:

我讨厌防火墙、负载平衡器、路由器等……想把它们都扎根!

反正我也不到,很多人都觉得买很蠢。为什么?所以常识是,他们都运行某种linux,所以只分析linux的一些缺陷。

人们甚至说针对 snort 的测试与针对可能运行 snort 或类似程序的 Cisco IDS 设备进行测试一样好......

所以这就是我想要做的:

我想至少重新创建网络设备的硬件条件,并将其与固件和预闪存设备相匹配?

客观题

我将如何确保我使用虚拟机创建的硬件环境准确地模拟真实情况,以便我可以对系统进行逆向工程(使用动态分析来查找二进制缺陷)?

额外的问题,以防您决定给我建议

我是不是把它变成了一个比它需要的更复杂的问题?

这是可以客观证明的吗?

最终,RE 物理设备更可取吗?

1个回答

首先,请注意大多数工业级网络设备不使用 Linux。如果他们这样做了,软件的大部分部分都必须以源代码的形式提供,以符合 GPL 要求。因此,虽然您 100 美元的 Linksys 路由器可能使用 Linux,但您 3000 美元的 Cisco 路由器不会,而且它也不会运行 snort。

(Cisco 的 IDS 和 Snort 可能有几个共同点,也许IDS 开发人员甚至从 Snort 复制了十几行代码,但是针对 snort 进行测试以找到针对 IDS 的攻击向量是非常愚蠢的)。

大多数路由器使用某种 MIPS 或 ARM 处理器。但是,它们的 IP 被转授权给不同的硬件工厂,并且您路由器中的处理器可能对“官方”版本进行了一些增强。也许他们添加了一些芯片来增强 DMA 传输以更快地路由网络数据包。也许他们添加了一个硬件 TCP 校验和生成器。你的 MIPS QEMU / ARM QEMU 处理器不会知道这些,所以你的模拟是行不通的。

现在,即使你知道你的路由器正在运行 linux,即使你知道一个 linux 错误,你也不能确定这个特定的错误是否可以在你的特定硬件上被利用。Shellshock需要 bash;它不会损害busybox shell,即使您的路由器使用bash(不太可能),它也可能是精简版。您必须在适合您实际硬件的仿真处理器上运行官方固件中的 linux 内核和官方固件中的工具,以检查您的错误是否可利用。

但是,官方内核可能甚至无法启动。内核会在某个时候尝试从非易失性存储中读取一些配置值。这可能是 I2C 总线上的专用芯片。您的仿真必须在正确的硬件地址上仿真该 I2C 总线。但是除非您颠倒了硬件,否则您不知道如何执行此操作。

内核将初始化每个路由器端口。这再次意味着它将以特定方式访问特定硬件。如果它没有找到路由器端口,它可能会打开一个红色的“硬件错误”LED 并进入无限循环。因此,如果您不模拟路由器端口,您的内核将无法启动,除非您模拟 LED,否则您甚至不知道为什么。同样,您需要硬件信息。

最后,了解有关硬件的详细信息可能有助于您利用某些东西。假设每个路由器端口都有一个对应的 /dev/portXX 设备,它接受ioctls 来设置比特率、双工和类似的参数。假设所有这些 /dev/portXX 设备具有相同的主 ID,以及从 0 到 31 的次要 ID。

也许端口驱动程序使用次要 id 来计算硬件地址,而不是先对次要 id 进行完整性检查。创建一个次要 ID 介于 32 和 255 之间的设备节点可能允许您在具有不同含义的以太网端口之后写入硬件寄存器。也许端口使用地址0x8000000到0x8000001f,0x80000040是配置cmos的地址。创建次要 ID 为 64 的 /dev/port64 可能允许您使用端口 ioctl 来读/写 cmos。但是,除非您对硬件有明确的深入了解,否则您永远不会发现这种漏洞。