【固件分析】以TP-LINK路由器为例论家用路由器固件对电子物证的意义(重制版)

作者:密斯拉神殿 发布:2026-09-29 08:02 收录:2026-09-29 11:48 4 次阅读 约 1492 字
摘要:前言之前测了买的二手路由器的CVE,现在该继续发挥利用价值,本文将采用CH341A编程器对路由器FLASH闪存
推荐理由:本文涵盖「电子物证」、「CVE」、「电子证据」等多个主题,重点关注 电子物证。

前言

不知道为啥看不到,重新发一遍。之前测了买的二手路由器的CVE,现在该继续发挥利用价值,本文将采用CH341A编程器对路由器FLASH闪存进行提取,并对提取的闪存进行分析以讨论家用路由器闪存内容是否可以作为电子证据的一部分。

提取

将路由器拆开后,其面板如下图
其中闪存为图中左上角八针芯片,具体如下图。这是一颗台湾亿芯产的25系列芯片,最上面的cFeon代表生产厂商,QH16-104HIP为芯片参数,其中Q的意思为系列标识,H为电压标识对应3.3V,16代表内存大小,单位为Mbit即固件大小最多2MB,104为时序等级编码,HIP为封装等级后缀。
本文采用的CH341A如下图,基座上面8个针孔为25系列,下面为24系列。
将SOP8芯片夹连接后如下图。
芯片夹夹住闪存芯片如下所示,可以看到路由器的灯也通电,需要注意的是,芯片夹的红线必须对应芯片上凹陷圆点的位置,切忌夹反。
使用NeoProgrammer.exe检测读取后,保存固件。

解析

提取完的固件直接丢给AI,其大致结构如下
加载器是flash最先执行的一段代码,其大致结构如下
AI可以直接反编译初始化代码,这里展示部分解析结果
0x0D80  lui   $t0, 0xb804          ; ── 第一段:GPIO 输出功能0x0D84  lw    $t1, 0($t0)          ;    $t0 = 0xB80400000x0D88  lui   $t2, 0xffc30x0D8C  ori   $t2, $t2, 0x0fff      ;    mask 0xFFC30FFF → 清 bit12..210x0D90  and   $t1, $t1, $t20x0D94  lui   $t2, 0x00020x0D98  or    $t1, $t1, $t2          ;    置 bit170x0D9C  sw    $t1, 0($t0)…0x0E80  lui   $t0, 0xb8040x0E84  ori   $t0, $t0, 0x0030       ;    $t0 = 0xB8040030  (GPIO_OUT_FUNC1)0x0E88  lw    $t1, 0($t0)0x0E8C  addiu $t2, $zero, 0xff000x0E90  and   $t1, $t1, $t2          ;    保 GPIO5 字段,清 GPIO4/6/70x0E94  sw    $t1, 0($t0)0x0E98  lui   $t0, 0xb8040x0E9C  ori   $t0, $t0, 0x006c       ; ★ $t0 = 0xB804006C = AR934X_GPIO_REG_FUNC0x0EA0  lw    $t1, 0($t0)            ;    读-改-写0x0EA4  addiu $t2, $zero, 0x0002     ; ★ 0x0002 = BIT(1) = JTAG_DISABLE0x0EA8  or    $t1, $t1, $t20x0EAC  sw    $t1, 0($t0)            ; ★ 写入:GPIO_FUNC |= JTAG_DISABLE0x0EB0  lui   $t0, 0xb8040x0EB4  lw    $t1, 0($t0)0x0EB8  addiu $t2, $zero, 0xfff00x0EBC  and   $t1, $t1, $t2          ;    清 GPIO0..3 输出位(把 JTAG 四根脚拉低)0x0EC0  sw    $t1, 0($t0)0x0EC4  jr    $ra
引导器和主镜象主要为路由器启动后UART串口的初始化和CLI命令的启动,这里不走过多分析。最关键的为文件系统和配置,该路由器的文件系统为自定义索引结构,其超级块结构如下。
0x140960  6F 77 6F 77 6F 77 6F 77 …  "owowowowowowowowowowowowowowowow"   ; 32 B 魔数/签名0x140980  00 00 00 01                                        ; u32BE = 1        (版本?)0x140984  00 00                                              ; u16BE = 00x140986  00 AC                                              ; u16BE = 172      ★ 目录项数0x140988  00 00 77 7C                                        ; u32BE = 0x777C   (数据区/校验相关字段)0x14098C  ── 目录表开始 ──
目录项结构如下
+0x00  char   name[42]      文件名(ASCII,NUL 填充;无路径、无子目录 —— 扁平单层)+0x2A  u16BE  size          该文件在 flash 上占的压缩字节数+0x2C  u32BE  offset        相对 FS 基址(0x140960)的偏移共 0x30 = 48 字节,172 项,目录区 = 0x14098C .. 0x1429CC(8,256 B)
按照索引结构提取文件,提取出固件中htm、js和jpg文件共172项,部分文件展示如下。
Index.htm —— 首页框架(<TITLE>TL-WR841N</TITLE>,charset=gb2312)menu.js / str_menu.js / str_err.js —— 菜单结构与中文字符串表(GB2312 编码)Thumbs.db —— Windows 资源管理器缩略图缓存被误打包(OLE 复合文档,23,552 B)。这是产线/开发打包流程"整目录塞进工具"的直接痕迹,属制造者指纹类证据。WlanStationRpm.htm / SystemLogRpm.htm / StatusRpm.htm —— 这三个是"无线客户端列表 / 系统日志 / 状态",但页面本体只有空模板(数据由固件在响应时注入 JS 数组),所以从固件里读不出连接历史。WlanSecurityRpm.htm(解压 27,486 B)/ WlanNetworkRpm.htm(23,880 B)—— 最大的两个页面
配置块是取证的关键,他记录了管理后台的账户密码和wifi的密码等等配置信息,存储了设备异常日志(没用网络日志)和序列号。
从固件来看,可以提取到的案件支撑性线索几乎为0,既没有明确的路由表记载,也没有连接设备历史记录统计。不过对于利用路由器XSS的记录还是留存下来的,如下表。如果看过之前那篇CVE测试的文章,这正是我测试时留下的痕迹,他们被保存在配置块的末尾,从这方面来说,固件的提取还是有一定意义的。
#
Desc
MAC(二进制存)
偏移
1
<img src=x onerror=alert(1)>
00:11:22:33:44:55
desc 0x1C2447 / mac 0x1C2468
2
<svg onload=alert(1)>
00:11:22:33:44:77
desc 0x1C2470 / mac 0x1C2491
3–6
x`sleep 8` 
/ x$(sleep 8) / `x
sleep 8/x&&sleep 8`
…67/68/69/6A
7
ZZMARKERZZ1234567890ZZ
00:11:22:33:44:77
desc 0x1C253D / mac 0x1C255E

结语

总的来看,至少对于这个路由器来看,固件数据的内容很难对案件还原或者起到支撑作用,其小内存也决定了开发者不可能往里面读写大量的数据,关键还是来到内存提取的方面,所幸的是AI解析到该路由器开启了UART,虽然在板子上没找到串口但是通过主控芯片引脚应该也可以尝试获取内存shell进而获取内存镜像。下一期的固件分析预定到路由器的内存提取与解析,如果感兴趣的请点个关注吧,这会为我提供更大的动力。
另外,之前的文章我提到要出一套题目,目前主体框架已经完备,基本都是物联网检材(也包含这个路由器),也是废了一番心思,我会尽量在美亚杯之前出完整套题目给各位师傅做做练手。

转载声明:本文转载自原发布平台 (作者:密斯拉神殿), 原文标题《【固件分析】以TP-LINK路由器为例论家用路由器固件对电子物证的意义(重制版)》, 查看原文。 版权归原作者及原发布平台所有,本站仅作收录与展示,未对正文内容作实质性修改; 若涉及侵权请联系本站处理。