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架构。
  • 文件系统: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算法,但数据范围调整。

解密步骤

  1. 修复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
    
  2. 修复XZ尾:替换尾部为 YZ

3. 内核解压与逆向

工具vmlinux-to-elf
步骤

  1. 提取vmlinux
    • 使用Qiling模拟执行decompress_kernel函数,解密内存中的XZ数据。
    • 保存解压后的内核到文件(如vmlinux_qiling)。
  2. 转换为ELF
    python3 vmlinux_to_elf.py vmlinux_qiling vmlinux.elf
    
  3. 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尾
    

打包步骤

  1. 使用修改后的mksquashfs
    mksquashfs rootfs squashfs_new.xz -comp xz
    
  2. 合并固件:
    dd if=squashfs_new.xz of=firmware.bin bs=1 seek=3145728 conv=notrunc
    

5. 植入后门(理论方案)

限制

  • 固件校验:文件大小/CRC校验严格,直接修改易触发失败。
  • 工具缺失:固件中删除ncwget等传输工具。

可行方案

  1. 替换二进制
    • 编译静态链接的BusyBox,替换/bin/ping
    • 通过Web接口触发命令执行。
  2. NFS注入
    • 修改服务二进制(如/usr/bin/httpd),插入汇编代码加载外部脚本。

6. 关键工具与代码

  • binwalk:固件结构分析。
  • Qiling:模拟执行解密逻辑。
  • vmlinux-to-elf:内核转换工具。
  • xz-embedded:XZ算法源码(下载链接)。

参考链接


总结:TVT固件通过修改XZ头尾实现加密,需定制工具解包/打包。内核和文件系统均需修复Magic字段,逆向时注意CRC校验和内存布局。

TVT固件加解密分析教学文档 1. 固件结构分析 工具 : binwalk 关键信息 : uImage :Uboot引导的Legacy格式内核镜像,未压缩,加载地址 0x80008000 ,入口点 0x80008000 。 头部CRC: 0xFDB88F62 ,数据CRC: 0x2E36A415 。 内核版本: Linux-4.9.37 ,ARM架构。 文件系统 :SquashFS 4.0,XZ压缩,块大小 1MB ,创建时间 2023-02-08 。 分区布局: 0x0-0xE0000 :Uboot(896KB) 0xE0000-0x300000 :Kernel(2176KB) 0x300000-0x1A00000 :SquashFS(23MB) 其他分区: config (4MB)、 log (2MB)。 内核启动参数 : 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头 : 修复XZ尾 :替换尾部为 YZ 。 3. 内核解压与逆向 工具 : vmlinux-to-elf 步骤 : 提取vmlinux : 使用Qiling模拟执行 decompress_kernel 函数,解密内存中的XZ数据。 保存解压后的内核到文件(如 vmlinux_qiling )。 转换为ELF : IDA分析 :加载 vmlinux.elf ,基地址设为 0x80008000 。 关键函数 : dec_main :XZ解压主逻辑,处理Stream Header/Block/Footer。 xz_crc32 :CRC校验表初始化(多项式 0xEDB88320 )。 4. 文件系统解包与打包 解包工具 : unsquashfs (需打补丁支持TVT头) 补丁逻辑 : 修改 xz_wrapper.c ,在压缩时插入TVT头尾: 打包步骤 : 使用修改后的 mksquashfs : 合并固件: 5. 植入后门(理论方案) 限制 : 固件校验:文件大小/CRC校验严格,直接修改易触发失败。 工具缺失:固件中删除 nc 、 wget 等传输工具。 可行方案 : 替换二进制 : 编译静态链接的BusyBox,替换 /bin/ping 。 通过Web接口触发命令执行。 NFS注入 : 修改服务二进制(如 /usr/bin/httpd ),插入汇编代码加载外部脚本。 6. 关键工具与代码 binwalk :固件结构分析。 Qiling :模拟执行解密逻辑。 vmlinux-to-elf :内核转换工具。 xz-embedded :XZ算法源码( 下载链接 )。 参考链接 : TVT固件解密工具 SquashFS逆向 总结 :TVT固件通过修改XZ头尾实现加密,需定制工具解包/打包。内核和文件系统均需修复Magic字段,逆向时注意CRC校验和内存布局。