首页
社区
课程
招聘
[原创]中兴ZTE ZX279128S芯片固件解密
发表于: 2023-4-23 23:10 56707

[原创]中兴ZTE ZX279128S芯片固件解密

2023-4-23 23:10
56707

冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 2023-5-8 21:50 被XYUU编辑 ,原因:
收藏
点赞 13
打赏
分享
最新回复 (98)
雪    币: 4762
活跃值: (8986)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

中兴和华为的光猫都自带基于lxc容器技术的OpenWRT子系统,能在里面折腾的就不要在宿主机上折腾,这个容器的权限和宿主系统同级没必要折腾宿主系统,进入openwrt是这个命令 `saf console` 华为的是`saf-huawei console`进入密码自己逆向 (镜像路径/opt/upt/framework/saf/rootfs 原则上最好不要修改这个路径里的文件但可以修改这个路径的文件/opt/upt/apps/apps 这个路径的文件会被bind挂载覆盖rootfs里的文件)进入这个openwrt系统后可以安装ipk的包。

最后于 2023-4-25 06:54 被微启宇编辑 ,原因:
2023-4-24 05:42
2
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
微启宇 中兴的光猫自带基于lxc容器技术的OpenWRT子系统你可以在里面折腾这个容器的权限和宿主系统同级没必要折腾宿主系统,进入openwrt是这个命令 `saf console` 进入密 ...

感谢分享,我的这个光猫实际上,只是用了中兴的芯片,里边的系统是被阉割过了的,所以是没有saf命令了,同时/opt/upt/framework/目录下都是空的,/opt/upt/apps/下也都是空的,折腾也是不得已。

最后于 2023-4-24 09:14 被XYUU编辑 ,原因:
2023-4-24 09:13
0
雪    币: 10077
活跃值: (34146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2023-4-24 09:17
1
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果有人能找到该固件通过使用数据库配置能启动busybox的crond服务的话,那也是极好的,至少能实现不少事情了,运营商的这种芯片的光猫市占率极高。
2023-4-24 14:28
0
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6

说一个另外的思路,从已有固件中获得内核版本,然后将cpio的文件系统放入内核源码,编译为zImage,然后和dtb一起制作成uImage,uImage就是系统uboot可引导的固件类型,这样也许就要替换uboot了。


我自己根据原版固件的版本通过源码编译的kernel制作成的zImage和uImage已经放在分享的云盘里了,这个zImage和uImage的rootfs里的/etc/init.d/rcS里的末尾加了一个自启的shell入口,即:/userconfig/init.sh,另外还加入了crond的服务器启动,配置路径也在/userconfig/crond。

文件系统是基于原版固件的最新版本制作的,仅加了如下内容:

if [ -x /userconfig/init.sh ]
then
/userconfig/init.sh
fi
crond -c /userconfig/crond

编译后的数据放在了complie目录了。

最后于 2023-4-29 09:58 被XYUU编辑 ,原因:
2023-4-24 22:27
0
雪    币: 4762
活跃值: (8986)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
XYUU 微启宇 中兴的光猫自带基于lxc容器技术的OpenWRT子系统你可以在里面折腾这个容器的权限和宿主系统同级没必要折腾宿主系统,进入openwrt是 ...

用usb转串口接到光猫然后用串口工具看看uboot启动时的日志,看看uboot是否正常载入内核和报啥错误。

最后于 2023-4-25 07:14 被微启宇编辑 ,原因:
2023-4-25 06:57
0
雪    币: 4762
活跃值: (8986)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8

这有官方的固件,建议折腾官方可升级的固件而不是自己dump下来的, 自己dump下来然后在刷入会有无法启动的风险(我以前就这样玩废好几台光猫)。 [固件] 中国移动H3-2s全国省份固件,支持网页升级 d81K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0K9r3W2F1j5h3c8K6L8q4)9J5k6h3&6W2N6q4)9J5c8X3k6G2M7Y4g2E0i4K6u0W2M7r3S2H3i4K6y4r3L8h3!0V1i4K6y4p5N6X3W2W2N6%4c8Z5M7X3g2S2k6q4)9J5y4X3q4E0M7q4)9K6b7Y4c8A6k6q4)9K6c8o6p5%4x3o6j5%4x3q4)9J5y4X3q4E0M7q4)9K6b7X3S2A6k6$3S2D9K9h3N6Z5N6q4)9K6c8p5R3K6i4K6u0V1x3W2x3`.


玩嵌入式设备没有usb转串口线是没法看日志排查错误的,最好也要NAND flash的烧录器,一旦出现变砖问题可以用热风抢拆盘写数据。

最后于 2023-4-25 07:18 被微启宇编辑 ,原因:
2023-4-25 07:03
0
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
微启宇 这有官方的固件,建议折腾官方可升级的固件而不是自己dump下来的, 自己dump下来然后在刷入会有无法启动的风险(我以前就这样玩废好几台光猫)。 [固件]& ...

我有串口小板的,这个帖子的固件我下过,没花猫币就找到了,而且我还测试过,他的固件只是比我的版本早些而已,大概是2021年6月20日的。

说一下最终结论吧,实际上到这里,固件的解密工作已经完成得差不多了。有dtb和rootfs了,然后放到相应得kernel源码里编译一份zImage就完成了。


所有的校验工作都是在uboot里,我把uboot载入到IDA里看了一下,uboot有Hash和RSA校验
ROM:00006E0B        0000000E        C        HASH timeout\n
ROM:00006E19        0000000D        C        RSA timeout\n
ROM:00006E26        0000000D        C        AES timeout\n
同时会根据固件头的Magic Number去找uImage的入口

ROM:00023974                 DCB 0x99,0x99,0x99,0x99,"DDDDUUUU",0xAA,0xAA,0xAA,0xAA

ROM:00024134                 DCB 0x99,0x99,0x99,0x99,"DDDDUUUU",0xAA,0xAA,0xAA,0xAA

ROM:00024B18                 DCB 0x99,0x99,0x99,0x99,"DDDDUUUU",0xAA,0xAA,0xAA,0xAA

与这个uboot相匹配的CPU还有
ROM:0005446F        00000014        C        CPU  : ZX279128@A9,
ROM:00054483        00000015        C        CPU  : ZX279128S@A9,
ROM:00054498        00000015        C        CPU  : ZX279127S@A9,
验证通过后会跳到
ROM:00006E84        0000000C        C        verify OK!\n
如果出现问题则会
ROM:00006EA3        00000016        C         code hash error !! \n
否则,则会
ROM:00006EB9        00000012        C        code hash ok !! \n
uboot的版本信息
ROM:0005122B        00000030        C        U-Boot 2013.04-svn1633 (Oct 19 2021 - 10:18:42)
启动参数
ROM:00051296        00000082        C        bootcmd=setenv bootargs mem=512M console=$(console) ubi.mtd=5 root=ubi0:rootfs rootfstype=ubifs init=/linuxrc ro;bootm 0x42000100
ttl波特率
ROM:00051324        00000010        C        baudrate=115200
串口参数
ROM:0005140D        00000019        C        console=ttyAMA0,115200n8
载入地址
ROM:000513B5        00000014        C        loadaddr=0x44000000
相关的文件名:
ROM:00051426        00000013        C        bootfile=uboot.bin
ROM:00051439        0000001E        C        bootloaderfile=bootloader.bin
ROM:00051457        00000016        C        linuzfile=vmlinuz.bin
ROM:0005146D        00000015        C        fullfile=upgrade.bin
配置文件:
ROM:0005148D        0000001E        C        configfile=zxic_pubconfig.bcb
接下来会校验zImage的magic number:
ROM:0005489D        0000001D        C        Bad Linux ARM zImage magic!\n
内置了gzip解压算法
ROM:00054B04        00000051        C        GUNZIP: uncompress, out-of-mem or overwrite error - must RESET board to recover\n
也内置了lzma解压算法
ROM:00054B55        00000046        C        LZMA: uncompress or overwrite error %d - must RESET board to recover\n
其他压缩格式会提示
ROM:00054B9B        00000023        C        Unimplemented compression type %d\n
验证uImage的magic number
ROM:00054BF7        00000012        C        Bad Magic Number\n
uImage头部crc32验证
ROM:00054C09        00000015        C        Bad Header Checksum\n
uImage数据crc32验证
ROM:00054C39        0000000E        C        Bad Data CRC\n
后面就是从tftp载入镜像的内容,也会校验上述逻辑
支持的芯片代号:
ROM:0005C1FC        0000001A        C        Board: ZXIC zx279127sevb\n
ROM:0005C216        0000001A        C        Board: ZXIC zx279128sevb\n
ROM:0005C230        00000019        C        Board: zxic zx279128evb\n
ROM:0005C249        00000019        C        Board: zxic zx279127evb\n
支持的8脚闪存颗粒:
ROM:00059D2A        0000001F        C        SPI NAND FM25G02B  256MiB 3,3V
ROM:00059D49        0000001F        C        SPI NAND PN26G01A 128MiB 3,3V 
ROM:00059D68        00000024        C        SPI NAND GD5F1GQ4UAYIG 128MiB 3,3V 
ROM:00059D8C        00000023        C        SPI NAND F50L1G41A (2Y)128MiB 3,3V
ROM:00059DAF        00000023        C        SPI NAND MX35LF1GE4AB  128MiB 3,3V
ROM:00059DD2        00000023        C        SPI NAND MX35LF2GE4AD  256MiB 3,3V
ROM:00059DF5        00000024        C        SPI NAND GD5F1GQ4UBYIG  128MiB 3,3V
ROM:00059E19        00000026        C        SPI NAND TC58CVG1S3HXAIX  256MiB 3,3V
ROM:00059E3F        00000023        C        SPI NAND BWM73D044SNF  256MiB 3,3V
ROM:00059E62        0000001E        C        SPI NAND BWJX08U  256MiB 3,3V
ROM:00059E80        0000001E        C        SPI NAND BWET08U  256MiB 3,3V
ROM:00059E9E        00000023        C        SPI NAND HYF2GQ4UHCCAE 256Mib 3,3V
ROM:00059EC1        00000023        C        SPI NAND HYF2GQ4UAACAE 256Mib 3,3V
ROM:00059EE4        00000023        C        SPI NAND XT26G02AWSEGA 256Mib 3,3V
ROM:00059F07        0000001F        C        SPI NAND W25M02GV  256MiB 3,3V
ROM:00059F26        00000020        C        SPI NAND AFY2G08U0A 256MiB 3,3V
ROM:00059F46        00000026        C        SPI NAND MT29F2G01ABAGDSF 256MiB 3,3V
ROM:00059F6C        00000021        C        SPI NAND ZD35X2GAXXX 256MiB 3,3V
ROM:00059F8D        00000020        C        SPI NAND F50L2G41LB 256MiB 3,3V
ROM:00059FAD        0000001E        C        SPI NAND FM25S02A 256MiB 3,3V
以及一些48脚闪存颗粒
ROM:0005B0AA        00000011        C        Hynix H27U1G8F2B
ROM:0005B0BB        00000010        C        MX30LF1G08AA-TI
ROM:0005B0CB        00000013        C        MT29F1G08ABAEAWP:E
ROM:0005B0DE        00000010        C        esmt F59l1G81MA
ROM:0005B0EE        00000015        C        WINBOND W29N01GVSIAA
ROM:0005B103        00000014        C        Hynix HY27U1G6F2C1R
ROM:0005B117        00000012        C        ST NAND256W3A2BN6
ROM:0005B129        00000013        C        Hynix HY27UF082G2B
ROM:0005B13C        00000013        C        Hynix HY27UT084G2M
ROM:0005B14F        00000013        C        Hynix HY27UV08BG5M
ROM:0005B162        00000012        C        Samsung K9F208U0B
ROM:0005B174        00000013        C        Samsung K9K8G08U0D
ROM:0005B187        00000013        C        Hynix H8BCS0SI0MBR
ROM:0005B19A        00000013        C        Samsung K9G8G08U0M
ROM:0005B1AD        00000012        C        XTX-PN27G01ABGITG
ROM:0005B1BF        00000011        C        S34ML02G200TF100
ROM:0005B1D0        0000000D        C        W29N02GVSIAA
ROM:0005B1DD        0000000F        C        F59L2G81A-25TG
ROM:0005B1EC        0000000D        C        MX30LF2G18AC
ROM:0005B1F9        0000000F        C        TC58VG1S3ETA00
ROM:0005B208        00000011        C        MX30LF2G018AC-TI
ROM:0005B219        00000012        C        HY27UF082G2A-TPCB
ROM:0005B22B        0000000D        C        MT29F2G08ABA
ROM:0005B238        00000010        C        H27U2G8F2CTR-BC
ROM:0005B248        0000000C        C        FMND2G08U3D
ROM:0005B254        00000012        C        FS33ND04GS108BFI0
ROM:0005B266        0000000C        C        ZD35X2GAXXX
ROM:0005B272        0000000D        C        MX30LF2G28AD
今天就分析这些,等焊油到了补一下ttl针脚开始调试了。

最后于 2023-4-26 17:37 被XYUU编辑 ,原因:
2023-4-25 09:19
0
雪    币: 3229
活跃值: (964)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mark
2023-4-25 09:58
0
雪    币: 3229
活跃值: (964)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
建议备份一下出厂时 /GN25L95_datas  bob校准数据  /wlan wifi校准数据。校准丢失会影响光猫性能
2023-4-25 10:03
0
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12

我全盘都备份过的,那些地方我不会去动它的。


所以理论思路就是,找到这款芯片的uboot相关的编译参数配置,然后将参数配置放到uboot源码中编译,编译完成后放入仿真环境测试,没问题后刷入uboot。然后就可以愉快的引导uImage的镜像固件(uImage是由rootfs放入内核编译获得zImage然后与dtb合成)。此后的标准固件就都可以用了,对于官方原版固件则可以通过我的解包程序解出uImage,刷入即可使用。


另一种思路则是patch掉官方uboot的校验code hash校验内容,其他crc32的校验内容倒可以还原。

最后于 2023-5-3 10:13 被XYUU编辑 ,原因:
2023-4-25 10:56
0
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13

先尝试patch一下uboot放到仿真环境测试一下效果,所以这一步就是找到uboot的基址,目前数据中大部分字符串我已手工恢复。接着就是找一个arm的uboot编译过去,然后IDA打开找找特征。


我又用自己编写的工具解了一个吉比特GM693-R的光猫固件,也是这个芯片的,固件除了最后rootfs.cpio的压缩格式是gzip的之外,解包工具基本可以通用,而且gzip解包找结束偏移的特征也很明显,就是gzip结束后的对齐字节紧跟着就是gzip的块长度值。lzma的特征则是块结束后的对齐字节的值就是结束位置的offset。


也就是rootfs和kernel组合生成zImage的特征基本是同一套编译器生成的。

最后于 2023-4-25 19:47 被XYUU编辑 ,原因:
2023-4-25 14:02
0
雪    币: 4762
活跃值: (8986)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14

给你上传一下这芯片的数据手册, 有这份资料的话可以知道针脚分布也可以自行画pcb板。

最后于 2023-4-28 00:16 被微启宇编辑 ,原因:
上传的附件:
2023-4-25 20:05
0
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15

ChatGPT回答:


使用IDA pro打开uboot程序的bin文件,设置正确的处理器类型和加载地址,然后使用IDA pro的反汇编功能分析bin文件的结构和代码。
在IDA pro中,找到uboot程序的入口点,通常是.text段的开头,然后跟踪执行流程,找到第一个BL指令,该指令调用了main函数。
在IDA pro中,观察R2寄存器的值,该值就是main函数的地址,然后按g键输入R2的值,就可以跳转到main函数的位置。


我使用该方法没有找到基址。

最后于 2023-4-26 11:18 被XYUU编辑 ,原因:
2023-4-25 22:10
0
雪    币: 2621
活跃值: (3464)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
你的分析已经超过绝大部分人了
2023-4-26 16:02
0
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
龙岱客 你的分析已经超过绝大部分人了[em_13]
可我目前还是没有搞定,如果厂商能提供uboot编译的配置文件,也就能自己编译uboot了,这块我也没搞到,唉。
2023-4-26 17:39
0
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18

按照帖子的方法:
https://bbs.kanxue.com/thread-267719.htm
找了一下uboot的基址,大概是:0x47EE0000

先调出string窗口,找到
ROM:47F34BF7        00000012        C        Bad Magic Number\n
搜字符串4BF7能看到:
ROM:47F0F128        sub_47F0F018                        LDR             R0, =0x47F34BF7
ROM:47F0F22C                dword_47F0F22C  DCD 0x47F34BF7          ; DATA XREF: sub_47F0F018+110↑r

ROM:00054BF7                aBadMagicNumber DCB "Bad Magic Number",0xA,0
然后0x47F34BF7-0x54BF7=0x47EE0000

果然在字符串中发现了,x47ee0000

接着下面有一行0x47f00000,这大概就是入口的地址了,跳过去按C,好激动。

最后于 2023-4-26 20:29 被XYUU编辑 ,原因:
2023-4-26 19:13
0
雪    币: 4762
活跃值: (8986)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
XYUU 可我目前还是没有搞定[em_13],如果厂商能提供uboot编译的配置文件,也就能自己编译uboot了,这块我也没搞到,唉。
给配置编译了也用不了, uboot里有芯片厂商独有的代码但这是不能公开的比如各个模块的初始化。不是芯片厂商给的代码属于公版编译了就算run起来也只是arm核心run而已。
2023-4-26 20:21
0
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
微启宇 给配置编译了也用不了, uboot里有芯片厂商独有的代码但这是不能公开的比如各个模块的初始化。不是芯片厂商给的代码属于公版编译了就算run起来也只是arm核心run而已。
以我对GPL2.0协议的理解,凡是使用了uboot代码的项目就必须开源,否则就违反了协议,所以芯片厂商有不能公开的内容就不能使用uboot源码,而我从二进制代码中发现了大量uboot的常量字符串能证实使用了uboot源码。
2023-4-26 23:03
0
雪    币: 4762
活跃值: (8986)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
XYUU 以我对GPL2.0协议的理解,凡是使用了uboot代码的项目就必须开源,否则就违反了协议,所以芯片厂商有不能公开的内容就不能使用uboot源码,而我从二进制代码中发现了大量uboot的常量字符串能证实 ...
那你可以试试去问光猫设备的生产商要源码。
2023-4-27 00:10
0
雪    币: 5151
活跃值: (4227)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
22
博主文中说修改完固件后重启失败,能上传一下启动过程中的完整串口log吗
2023-4-27 14:23
0
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
Q老Q 博主文中说修改完固件后重启失败,能上传一下启动过程中的完整串口log吗
焊油刚到,我处理好了再发出来。
2023-4-27 16:21
0
雪    币: 2621
活跃值: (3464)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24

修改固件起不来应该是uboot对kernel的rsa签名校验过不了,如果只是crc就好弄

最后于 2023-4-27 17:06 被龙岱客编辑 ,原因:
2023-4-27 17:04
0
雪    币: 148
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
龙岱客 修改固件起不来应该是uboot对kernel的rsa签名校验过不了,如果只是crc就好弄

应该不是,我看是我处理掉了一个crc32的值,然后我又重新处理了,结果直接ttl显示start kernel...后就死机了,大概率是我动了kernel的内容,估计是我自己把kernel改坏了。我打算自己去编译一个kernel,然后在给里边内置一个lxc的openwrt,我目前的进展是进入到了kernel里去了,我已经感觉到我大概率成功了。


带着这些欣喜,我有尝试过了,昨晚又搞了大半夜,自己编译的内核刷进去后卡在start kernel的位置,而且rootfs编译的和原版固件差了0.4m多的体积,目前的猜测应该是uboot里做了手脚。

最后于 2023-4-29 09:37 被XYUU编辑 ,原因:
2023-4-27 20:43
0
游客
登录 | 注册 方可回帖
返回