L07A音响系统分析:在尝试固化SSH服务过程中遇到的技术问题

张开发
2026/4/11 4:06:14 15 分钟阅读

分享文章

L07A音响系统分析:在尝试固化SSH服务过程中遇到的技术问题
本文记录了对L07A音响进行系统分析的一次失败尝试。目标是实现SSH服务的开机自动启动以便通过网络进行管理。然而在尝试了多种方案后均以失败告终。本文将详细记录这一过程中的技术探索、遇到的障碍以及最终的分析结论。0x00 失败的开始一次“看起来成功”的尝试最初通过TTL串口成功获取了设备的root访问权限。利用设备的A/B双系统机制切换到了旧版本系统并尝试修改了SquashFS格式的系统文件。修改完成后SSH服务确实可以手动启动看起来一切顺利。然而设备重启后所有修改都消失了。SSH无法连接系统恢复原状。这意味着之前的修改只存在于运行时的内存中从未真正实现持久化或者写入了NAND但系统在启动时拒绝了修改后的固件。于是我开始了为期数天的深度分析。这条路最终通向了一个完全失败的结论。0x01 使用的分析工具WinHex十六进制编辑器用于直接查看NAND备份文件的原始十六进制内容搜索特定字节模式对比修改前后的文件差异。尝试过的操作搜索SquashFS文件系统标识53 51 48 53搜索Android启动镜像标识41 4E 44 52 4F 49 44 21对比原始镜像和修改后镜像的差异binwalk固件分析工具用于分析官方固件的结构识别其中包含的文件类型。尝试过的操作分析固件结构递归提取可识别的文件计算熵值以发现加密区域0x02 第一次失败NAND闪存的“0xFF陷阱”问题发现在第一次尝试备份和恢复时设备变砖了。经过分析发现了一个被很多教程忽略的问题。NAND闪存与普通硬盘存在重要差异NAND闪存擦除后所有字节都是0xFF二进制全1而普通硬盘的空白区域通常是0x00。用WinHex打开NAND备份文件有效数据结束后全是FF FF FF ...text02200000 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 02200010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF错误的操作按照很多教程的做法执行了以下命令bashdd if/dev/mtdblock4 ofsystem0.img bs1M count36864 # ... 修改镜像 ... dd ifsystem0_modified.img of/dev/mtdblock4 bs1M失败原因用WinHex对比原始镜像和修改后的镜像发现修改后的镜像末尾出现了0x00文件系统打包时的对齐填充而原始镜像末尾是0xFF。当修改后的镜像写回NAND后这些0x00覆盖了原本的0xFF触发了NAND的ECC校验机制导致分区无法挂载设备变砖。这次失败的教训NAND闪存与普通硬盘的存储特性不同dd命令的count参数可能导致问题恢复前必须先擦除分区打包文件系统时需要避免0x00填充正确的操作虽然最终仍然失败bash# 备份先获取精确大小 cat /sys/block/mtdblock4/size dd if/dev/mtdblock4 ofsystem0.img bs512 count精确扇区数 # 恢复先擦除再写入 mtd erase system0 mtd write system0_modified.img system0 # 打包使用-noappend参数 mksquashfs squashfs-root system0.img -b 131072 -comp xz -no-xattrs -noappend0x03 第二次失败启动验证机制问题发现在解决了NAND存储问题后刷入修改后的固件系统仍然无法启动修改后的版本。启动日志中的线索设备启动时的串口输出包含以下信息text[252]HELLO! SBOOT is starting! ... [1094]load rootfs1-key hash [1159]load rootfs2-key hash [1226]load u-boot-key hash这些信息表明存在验证机制。固件结构分析使用binwalk分析官方固件bashbinwalk 1.50.10-mico_firmware.bin发现了以下结构偏移0x2E0Android启动镜像偏移0x2F9AE0x509格式证书偏移0x2FA320SquashFS文件系统偏移0x17FA324x509格式证书发现了两个证书文件。证书分析用WinHex打开证书文件在特定偏移位置看到一段32字节的数据。这段数据与U-Boot启动时打印的哈希值一致说明证书中存储了官方固件的签名信息。尝试绕过验证尝试一修改证书中的哈希值。将证书中的官方哈希值替换为自己固件的哈希值重新打包刷入。结果U-Boot报告证书签名验证失败证书本身也有签名保护。尝试二修改U-Boot二进制。用WinHex修改U-Boot将验证跳转改为无条件跳转。结果设备完全无法启动第一级引导程序验证U-Boot签名失败。这次失败的教训固件中包含证书文件证书有签名保护无法直接修改U-Boot也有签名保护存在多级验证机制0x04 第三次失败分析U-Boot本身提取U-Boot根据启动日志U-Boot存储在NAND的特定位置bashdd if/dev/mtdblock0 ofuboot.bin bs512 skip768 count1024二进制分析用WinHex搜索uboot.bin发现以下字符串rootfs1 verifyrootfs2 verifypubkey rootfs1 valid这些字符串证实了U-Boot中硬编码了验证逻辑。尝试修改尝试修改U-Boot二进制文件中的验证逻辑。结果设备变砖连U-Boot都无法加载。因为第一级引导程序验证U-Boot签名失败。这次失败的教训验证逻辑硬编码在U-Boot中U-Boot本身有签名保护无法通过修改U-Boot绕过验证0x05 最终结论硬件级安全启动芯片手册信息查阅芯片技术手册确认该芯片支持安全启动Secure Boot功能引导程序固化在芯片内部ROM中根公钥存储在eFUSE一次性可编程存储器中签名验证由硬件完成无法软件绕过完整启动链条text芯片内部ROM (SBOOT) ← 固化不可修改 │ ▼ 硬件签名验证无法绕过 NAND中的boot0 ← 有数字签名 │ ▼ 签名验证 NAND中的U-Boot ← 有数字签名 │ ▼ 签名验证 Kernel Rootfs ← 有数字签名设备配置确认查看启动参数bashcat /proc/cmdline # 输出包含: sboot1 uboot_version10sboot1安全启动已启用uboot_version10使用较新版本的U-Boot最终失败的根本原因SBOOT固化在芯片中无法通过任何软件方式修改根公钥在eFUSE中无法读取或修改签名验证由芯片硬件完成任何一级被修改后续所有级都无法启动所有软件层面的绕过尝试均失败0x06 操作过程中的错误总结第一次错误NAND备份恢复错误操作是直接dd覆盖未先擦除原因是了解NAND存储特性后果是设备变砖。第二次错误修改证书错误操作是直接修改证书中的哈希值原因是不知道证书也有签名保护后果是验证失败。第三次错误修改U-Boot错误操作是直接修改U-Boot二进制原因是不知道U-Boot也有签名保护后果是设备完全无法启动。最终认识所有软件层面的修改尝试都失败了因为安全启动机制是硬件级的。0x07 经验总结分析流程上的教训应该先查芯片手册了解硬件支持的安全特性应该先分析启动日志寻找验证相关的关键词不应该盲目相信教程因为不同设备的硬件配置不同修改前必须完整备份否则可能无法恢复。工具使用上的教训binwalk提取的文件边界可能不准确需要手动验证WinHex的文件对比功能很有用应该多用dd的count参数可能导致问题使用前先确认mtd写入前必须先擦除。对这个设备的最终判断安全启动功能已启用无法软件绕过引导程序有签名保护无法修改固件有签名验证修改后的固件无法启动所有持久化配置的尝试都已失败。附录使用的命令记录系统信息查看bashcat /proc/mtd cat /proc/cmdline cat /sys/block/mtdblock0/queue/hw_sector_sizeNAND操作虽然最终失败bash# 备份 dd if/dev/mtdblock4 ofbackup.img bs512 count扇区数 # 擦除 mtd erase system0 # 写入 mtd write system0_modified.img system0固件分析bashbinwalk firmware.bin binwalk -Me firmware.binSquashFS操作bashunsquashfs -s system0.img unsquashfs -d squashfs-root system0.img mksquashfs squashfs-root system0.img -b 131072 -comp xz -no-xattrs -noappend总结本文记录了在L07A音响上尝试固化SSH服务的完整失败过程。从NAND存储特性的误判到签名验证机制的发现再到最终确认硬件级安全启动无法绕过。虽然这次尝试以失败告终但过程中对嵌入式系统、NAND存储、安全启动机制的理解都有所收获。希望这些失败经验能为其他开发者提供参考避免走同样的弯路。

更多文章