分你所享、信息共享、轻松分享
来自民间的思想 | 送人玫瑰,手有余香。

有趣的闪存:通过实践分析意外内存泄漏

通过实践分析意外内存泄漏

写在前面的话

在这篇文章中,我们将对闪存进行分析。我的实验目标是一台别人“捐赠”过来的Netcomm N300路由器,在进行了深入研究之后,我可以通过修改设备闪存的读入操作并从未认证的Web接口获取目标Web服务器的内存数据。

开始分析

我们的路由器使用的是一块Macronix MX15L12835FMI闪存芯片(16针脚SOP): 通过实践分析意外内存泄漏 首先,我需要观察芯片的常规操作。在研究过程中,我发现它的闪存并没有得到充分使用,只有设备在启动(或加载整个操作系统)时或在使用Web管理面板时会使用到闪存。闪存芯片似乎使用的是Single API模式,其常规读取命令如下所示: 通过实践分析意外内存泄漏 命令开头为一个05 FF命令,根据数据表提供的信息,这条命令可以读取出寄存器的状态信息。我最初的目的是对闪存读取命令进行篡改,并用它来从硬盘中读取数据。 考虑到SPI命令是与时钟信号同步的,那我的攻击同样可以跟同一个时钟信号同步:我可以记录下时钟上升沿信号的数量,并在特定数量的时钟信号下将闪存芯片的15号针脚接地,然后修改闪存的读取命令并用它来读取其他信息。放大时钟信号后我们可以看到,数据只会在时钟信号的下降沿发生变化,所以我们的攻击应该是有效的。 通过实践分析意外内存泄漏 首先我们进入到设备的串行控制台中,然后使用命令cat /dev/mtdblock0来触发闪存的读取命令。该命令的原始状态如下所示: 通过实践分析意外内存泄漏 为了方便进行对比,所以我运行了cat /dev/mtdblock2: 通过实践分析意外内存泄漏 接下来,我连接了一个晶体管和一个FPGA,FPGA可以读取时钟信号并控制晶体管的开关,接地针脚15暂时等待几个时钟周期,并让其中的一个读取指令地址失效: 通过实践分析意外内存泄漏 我还专门编写了一个脚本来让程序等待一定的时钟周期,并修改闪存的读取操作,然后运行cat /dev/mtdblock2并通过示波器来监控闪存的命令执行情况: