tvt固件加解密分析
字数 1453 2025-08-22 12:23:00
TVT固件加解密分析教学文档
1. 固件结构分析
工具:binwalk
关键信息:
- uImage:Uboot引导的Legacy格式内核镜像,未压缩,加载地址
0x80008000,入口点0x80008000。- 头部CRC:
0xFDB88F62,数据CRC:0x2E36A415。 - 内核版本:
Linux-4.9.37,ARM架构。
- 头部CRC:
- 文件系统:SquashFS 4.0,XZ压缩,块大小
1MB,创建时间2023-02-08。- 分区布局:
0x0-0xE0000:Uboot(896KB)0xE0000-0x300000:Kernel(2176KB)0x300000-0x1A00000:SquashFS(23MB)- 其他分区:
config(4MB)、log(2MB)。
- 分区布局:
内核启动参数:
mem=179M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=squashfs mtdparts=hi_sfc:896K(boot),2176K(nva010000),23M(app),4M(config),2M(log)
2. XZ压缩格式与TVT定制修改
标准XZ结构:
- Stream Header:Magic
FD 37 7A 58 5A 00+ CRC校验。 - Block:压缩数据块,含LZMA算法参数。
- Stream Footer:Magic
59 5A+ CRC校验。
TVT定制修改:
- 替换Magic:标准XZ头被替换为TVT头
E2 74 56 74 00 50 4B 47 B3 E3 00。 - 尾部修改:标准Footer替换为
05 C5 00 74 56 74 5E 00。 - 校验逻辑:CRC校验仍使用标准XZ算法,但数据范围调整。
解密步骤:
- 修复XZ头:
def repair_xz(input_file): with open(input_file, 'rb') as f: data = f.read() tvt_header = b'\xE2\x74\x56\x74\x00\x50\x4B\x47\xB3\xE3\x00' xz_header = b'\xFD\x37\x7A\x58\x5A\x00' repaired = xz_header + data[len(tvt_header):] return repaired - 修复XZ尾:替换尾部为
YZ。
3. 内核解压与逆向
工具:vmlinux-to-elf
步骤:
- 提取vmlinux:
- 使用Qiling模拟执行
decompress_kernel函数,解密内存中的XZ数据。 - 保存解压后的内核到文件(如
vmlinux_qiling)。
- 使用Qiling模拟执行
- 转换为ELF:
python3 vmlinux_to_elf.py vmlinux_qiling vmlinux.elf - IDA分析:加载
vmlinux.elf,基地址设为0x80008000。
关键函数:
dec_main:XZ解压主逻辑,处理Stream Header/Block/Footer。xz_crc32:CRC校验表初始化(多项式0xEDB88320)。
4. 文件系统解包与打包
解包工具:unsquashfs(需打补丁支持TVT头)
补丁逻辑:
- 修改
xz_wrapper.c,在压缩时插入TVT头尾:memcpy(new_buff, "\xE2\x74\x56\x74\x00", 5); // TVT头 memcpy(new_buff + new_size - 8, "\x05\xC5\x00\x74\x56\x74\x5E", 8); // TVT尾
打包步骤:
- 使用修改后的
mksquashfs:mksquashfs rootfs squashfs_new.xz -comp xz - 合并固件:
dd if=squashfs_new.xz of=firmware.bin bs=1 seek=3145728 conv=notrunc
5. 植入后门(理论方案)
限制:
- 固件校验:文件大小/CRC校验严格,直接修改易触发失败。
- 工具缺失:固件中删除
nc、wget等传输工具。
可行方案:
- 替换二进制:
- 编译静态链接的BusyBox,替换
/bin/ping。 - 通过Web接口触发命令执行。
- 编译静态链接的BusyBox,替换
- NFS注入:
- 修改服务二进制(如
/usr/bin/httpd),插入汇编代码加载外部脚本。
- 修改服务二进制(如
6. 关键工具与代码
- binwalk:固件结构分析。
- Qiling:模拟执行解密逻辑。
- vmlinux-to-elf:内核转换工具。
- xz-embedded:XZ算法源码(下载链接)。
参考链接:
总结:TVT固件通过修改XZ头尾实现加密,需定制工具解包/打包。内核和文件系统均需修复Magic字段,逆向时注意CRC校验和内存布局。