文章总结: 本文详细分析了TD路由器AX3000_Pro_V16.03.49.26固件,发现固件经过了修改,squashfs的SQUASHFS_MAGIC由hsqs更改为nice,xz的lzma_header_magic由ý7zXZ更改为Tenda。作者通过编译OpenWRT源码生成带符号的内核文件,用于IDA分析,并提供了修改xz-5.2.5和squashfs-tools源码的补丁,成功解压了固件。文章提供了完整的技术路径和代码补丁,对于路由器固件分析具有实用价值。 综合评分: 93 文章分类: 二进制安全,漏洞分析,逆向分析,IoT安全,安全工具
TD路由器固件分析
易之生生
看雪学苑
2025年12月19日 17:59 上海
环境配置
版本 :AX3000_Pro_V16.03.49.26
源码 :openwrt
#
固件分析
首先使用binwalk -E分析固件的熵,虽然已经解密了,但是固件的格式binwalk无法有效的识别。
binwalk US_AX3000.Pro_V16.03.49.26_cn_JAX01.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
64 0x40 Flattened device tree, size:3625955 bytes, version:17
296 0x128 LZMA compressed data, properties:0x6D, dictionary size:8388608 bytes, uncompressed size:10719240 bytes
3607560 0x370C08 Flattened device tree, size:16962 bytes, version:17
5273660 0x50783C PGP RSA encrypted session key - keyid:3B592D4E D1353F41 RSA (Encrypt or Sign) 1024b
但是使用file命令,可以识别出u-boot和Linux的内核信息。
file US_AX3000.Pro_V16.03.49.26_cn_JAX01.bin
US_AX3000.Pro_V16.03.49.26_cn_JAX01.bin:u-boot legacy uImage, \002, Linux/ARM, OS Kernel Image (lzma), 14553088 bytes, Fri Jan 10 06:24:02 2025, Load Address:0X46000000, Entry Point:0XFFFFFFFF, Header CRC:0XB19671AF, Data CRC:0XC47DB558
使用binwalk -Me US_AX3000.Pro_V16.03.49.26_cn_JAX01.bin 解压固件后,得到Linux的内核文件。
binwalk 128
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Linux kernel ARM64 image, load offset: 0x80000, image size: 11046912 bytes, little endian, 4k page size,
5498800 0x53E7B0 MPEG transport stream data
7561216 0x736000 ELF, 64-bit LSB shared object, version 1 (SYSV)
7580200 0x73AA28 gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)
7719424 0x75CA00 CRC32 polynomial table, little endian
7988227 0x79E403 Neighborly text, "neighbor get requestrequest"
7988277 0x79E435 Neighborly text, "neighbor get request get request"
7988332 0x79E46C Neighborly text, "neighbor get request"
7988601 0x79E579 Neighborly text, "neighbor get requestrequest"
7988651 0x79E5AB Neighborly text, "neighbor get requestest"
7988697 0x79E5D9 Neighborly text, "neighbor get request"
7988739 0x79E603 Neighborly text, "neighbor dump requestbor dump request"
7988797 0x79E63D Neighborly text, "neighbor dump request dump request"
7988852 0x79E674 Neighborly text, "neighbor dump request attribute in neighbor dump request"
7988929 0x79E6C1 Neighborly text, "neighbor dump requeste dump request"
7988979 0x79E6F3 Neighborly text, "neighbor table dump requestbor table dump request"
7989037 0x79E72D Neighborly text, "neighbor table dump request neighbor table dump request"
7989101 0x79E76D Neighborly text, "neighbor table dump request"
7989600 0x79E960 Neighborly text, "Neighbor entry is now dead"
9111144 0x8B0668 Unix path: /lib/firmware/updates/5.4.231
9200744 0x8C6468 Unix path: /sys/kernel/debug/mtketh/reset
9208205 0x8C818D Unix path: /sys/kernel/debug/hnat/cpu_reason
9208344 0x8C8218 Unix path: /sys/kernel/debug/hnat/cpu_reason
9210484 0x8C8A74 Unix path: /sys/kernel/debug/hnat/hnat_entry
9210552 0x8C8AB8 Unix path: /sys/kernel/debug/hnat/hnat_entry
9211260 0x8C8D7C Unix path: /sys/kernel/debug/hnat/hnat_setting
9211336 0x8C8DC8 Unix path: /sys/kernel/debug/hnat/hnat_setting
9213298 0x8C9572 Unix path: /sys/kernel/debug/hnat/static_entry
9214074 0x8C987A Unix path: /sys/kernel/debug/hnat/qos_toggle
9214151 0x8C98C7 Unix path: /sys/kernel/debug/hnat/qos_toggle
9214239 0x8C991F Unix path: /sys/kernel/debug/hnat/qos_toggle
9214334 0x8C997E Unix path: /sys/kernel/debug/hnat/qos_toggle
9214440 0x8C99E8 Unix path: /sys/kernel/debug/hnat/qos_toggle
9214535 0x8C9A47 Unix path: /sys/kernel/debug/hnat/qos_toggle
9214623 0x8C9A9F Unix path: /sys/kernel/debug/hnat/qos_toggle
9319056 0x8E3290 Unix path: /sys/firmware/devicetree/base
9320161 0x8E36E1 Unix path: /sys/firmware/fdt': CRC check failed
9333281 0x8E6A21 Neighborly text, "neighbor table overflow!app_solicit"
9367608 0x8EF038 Neighborly text, "NeighborSolicits"
9367632 0x8EF050 Neighborly text, "NeighborAdvertisementsErrors"
9372050 0x8F0192 Neighborly text, "neighbor %.2x%.2x.%pM losthas been deprecated and is always %u"
9386416 0x8F39B0 Unix path: /sys/module/wifi_core/parameters/wifi_driver_debug
10257728 0x9C8540 AES S-Box
10257984 0x9C8640 AES Inverse S-Box
IDA ARM64位的方式打开128固件,虽然可以搜索到大量的squashf函数字符串,但是都无法查看调用地址和引用地址。
这时就可以使用openwrt的源码来编译生成带符号链接的内核文件,然后生成签名文件,导入到IDA进行函数重命名。
内核编译
首先收集内核配置信息,发现固件是基于f86f8e568461681fc85caf3c972489045367030e版本生成的。
下载openwrt源码
git clone https://github.com/openwrt/openwrt.git
cd openwrt
git checkout openwrt-21.02
git checkout f86f8e568461681fc85caf3c972489045367030e
安装编译环境
sudo apt-get install subversion g++ zlib1g-dev build-essential git python3 libncurses5-dev gawk gettext unzip libssl-dev wget
下载安装软件包
./scripts/feeds update -a
./scripts/feeds install -a
生成.config配置文件,然后进入配置选项。
make defconfig
make menuconfig
在Global build settings中,选择Binary stripping method为none来保留符号编译。
保存退出后运行make来编译固件。
make -j8 V=s
将vmlinux.debug导出到Windows系统,使用IDA打开生成vmlinux.sig签名文件,即可还原函数名称。
find . -name vmlinux.debug
./build_dir/target-aarch64_cortex-a53_musl/linux-armvirt_64/vmlinux.debug
#
格式分析
跳转到固件地址0x380040,原来的squashfs的SQUASHFS_MAGIC由hsqs更变为了nice,xz的lzma_header_magic由ý7zXZ更变为了Tenda。
#
squashfs的SQUASHFS_MAGIC判断是在mtd_check_rootfs_magic函数中,但是因为源码经过了修改,找不到mtd_check_rootfs_magic函数,可以通过mtd_check_oob_ops的引用找到sub_3AC088。
xz的lzma_header_magic是在xz_dec_run中判断的,源码经过了修改,可以通过xz_dec_reset的引用找到,是sub_2B0DC0函数。
进入crc32_le_0_0,发现crc32_table的值发生了改变。
#
代码补丁
xz-5.2.5
xz-5.2.5的源码目录是./build_dir/host/xz-5.2.5
coder.c
374c374,375
< static const uint8_t magic[6] = { 0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00 };
---
> // static const uint8_t magic[6] = { 0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00 };
> static const uint8_t magic[6] = { 0x54, 0x65, 0x6E, 0x64, 0x61, 0x00 };
stream_flags_common.c
15,16c15,16
<
< const uint8_t lzma_header_magic[6] = { 0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00 };
---
> // const uint8_t lzma_header_magic[6] = { 0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00 };
> const uint8_t lzma_header_magic[6] = { 0x54, 0x65, 0x6E, 0x64, 0x61, 0x00 };
crc32_table_le.h
5,523c5,523
< 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
< 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
< 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
< 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
< 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
< 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
< 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
< 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
< 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
< 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
< 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
< 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
< ...省略,更多请“阅读原帖”
squashfs-tools
squashfs-tools的源码路径是./build_dir/host/squashfskit-v4.14/squashfs-tools
修改squashfs-tools的Makefile,将XZ_SUPPORT = 1,引入liblzma.a的静态库路径。
XZ_SUPPORT = 1
LZMA_LIB := ../../xz-5.2.5/src/liblzma/.libs/liblzma.a
修改squashfs_fs.h头文件的SQUASHFS_MAGIC为0x6563696E。
#define SQUASHFS_CACHED_FRAGMENTS CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE
#define SQUASHFS_MAJOR 4
#define SQUASHFS_MINOR 0
//#define SQUASHFS_MAGIC 0x73717368
#define SQUASHFS_MAGIC 0x6563696E
//#define SQUASHFS_MAGIC_SWAP 0x68737173
#define SQUASHFS_MAGIC_SWAP 0x6E696365
#define SQUASHFS_START 0
#
固件解压
首先编译xz-5.2.5的静态库文件。
#
cd ./build_dir/host/xz-5.2.5
./configure
make
然后编译生成unsquashfs程序。
cd ./build_dir/host/squashfskit-v4.14/squashfs-tools
make
使用dd命令从0x380040开始导出固件文件US_AX3000.squashfs,然后就可以使用编译好的unsquashfs程序进行解压了。
./unsquashfs US_AX3000.squashfs
Parallel unsquashfs: Using 10 processors
879 inodes (998 blocks) to write
create_inode: could not create character device squashfs-root/dev/console, because you're not superuser!
create_inode: could not create character device squashfs-root/dev/ttyAMA0, because you're not superuser!
create_inode: could not create character device squashfs-root/dev/ttyS0, because you're not superuser!
create_inode: could not create character device squashfs-root/dev/ttyS1, because you're not superuser!
create_inode: could not create character device squashfs-root/dev/ttyS2, because you're not superuser!
create_inode: could not create character device squashfs-root/dev/ttyS3, because you're not superuser!
create_inode: could not create character device squashfs-root/dev/ttyS4, because you're not superuser!
[==========================================================================================================================================| ] 991/998 99%
created 697 files
created 97 directories
created 175 symlinks
created 0 devices
created 0 fifos
#
看雪ID:易之生生
https://bbs.kanxue.com/user-home-920134.htm
*本文为看雪论坛精华文章,由 易之生生 原创,转载请注明来自看雪社区
往期推荐
从ANGR-CTF项目入手ANGR和符号执行技术
AI时代-逆向工作者该如何用好这一利器
EXIF解析缓冲区溢出漏洞分析与利用
从C到Pwn:栈溢出漏洞利用实战入门
Android-ARM64的VMP分析和还原
球分享
球点赞
球在看
点击阅读原文查看更多
查看原文:《TD路由器固件分析》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论