第二章:固件提取基础——Flash芯片类型识别、编程器选型与使用、JTAG/SWD接口调试

各位同行,大家好。欢迎来到《思科固件加密算法识别与绕过实战》的第二讲。

今天咱们聊点硬核的——怎么把固件从芯片里“掏”出来。你可能会说:“这有什么难的?直接读不就完了?”嗯,我当年也是这么想的,直到第一次面对一块被加密锁死的思科路由器主板,才发现事情没那么简单。

固件提取,说白了就是逆向工程的“敲门砖”。你连固件都拿不到,后面分析加密算法、找漏洞、搞绕过,全都是空谈。这一章,我会把Flash芯片识别、编程器选型、JTAG/SWD调试这些基础操作,掰开了揉碎了讲给你听。

核心观点:固件提取不是简单的“读数据”,而是一场与硬件加密机制的博弈。你不仅要懂芯片,还得懂协议、懂时序、懂绕过手段。

2.1 Flash芯片类型识别:别拿NOR当NAND用

拿到一块思科设备的主板,第一件事是什么?不是急着上编程器,而是先搞清楚板上装的是什么Flash芯片。

我见过太多新手,上来就怼编程器,结果要么读出来的数据全是0xFF,要么直接把芯片烧了。为什么?因为Flash芯片分好几种类型,接口、电压、时序都不一样。

常见的Flash芯片主要有三类:

  • NOR Flash:思科中低端设备常用,比如Cisco 2800系列、ISR 4300系列。特点是容量小(几MB到几十MB),但读取速度快,支持XIP(片上执行)。
  • NAND Flash:高端设备、存储密集型设备用得多,比如Cisco ASR 9000系列。容量大(几百MB到几GB),但读取慢,有坏块管理问题。
  • SPI Flash:现在越来越流行,引脚少(就4根线),封装小。很多新款思科交换机、路由器都用它存Bootloader和配置文件。

怎么识别?我个人的习惯是三步走:

  1. 看丝印:芯片表面印的型号,比如“MX25L12835F”就是一颗128Mb的SPI NOR Flash,“MT29F2G08AB”是2Gb的NAND Flash。
  2. 查手册:去芯片厂商官网下载Datasheet,确认接口类型、电压范围、指令集。
  3. 测电压:用万用表量一下VCC引脚对地电压。3.3V是主流,1.8V也有,但少见。

小技巧:思科设备上,Flash芯片旁边通常会有个“SPI”或“NAND”的丝印标记。如果找不到,可以顺着CPU的引脚走线反查——CPU的FMC(Flexible Memory Controller)接口通常连接NAND,QSPI接口连接NOR/SPI Flash。

2.2 编程器选型与使用:工欲善其事,必先利其器

编程器,就是用来读写Flash芯片的工具。市面上的编程器五花八门,从几十块的“山寨货”到几万块的“专业级”,到底该怎么选?

我的建议是:别贪便宜,也别盲目追求高端。

我刚开始做固件分析时,买过一个几十块的CH341A编程器。便宜是真便宜,但问题也多:

  • 电压不稳,经常读到一半报错
  • 支持的芯片型号有限,很多新出的Flash不识别
  • 速度慢,读一个128Mb的芯片要十几分钟

后来换了台RT809H,虽然贵了点(大概一千多),但用起来省心多了。支持芯片多、速度快、电压可调,还带ISP在线编程功能。

下面这张图是我整理的编程器选型对比表,供你参考:

编程器型号 价格区间 支持芯片类型 适用场景 推荐指数
CH341A 30-80元 SPI NOR Flash 入门学习、简单读取 ★★☆☆☆
RT809H 800-1500元 SPI/NOR/NAND/EMMC 中高级逆向、维修 ★★★★☆
Xeltek SuperPro 6100 3000-5000元 全系列Flash、PLD、MCU 专业级、批量生产 ★★★★★
Dataman 48Pro2 5000-10000元 全系列Flash、EPROM、PAL 军工、航天级应用 ★★★★★

使用编程器时,有几个坑你一定要避开:

警告:

  • 电压匹配:芯片是3.3V,编程器输出也是3.3V,别用5V去怼,会烧芯片。我曾经烧过一块MX25L12835F,就是因为没注意电压设置。
  • 引脚接触:用烧录座时,确保所有引脚都接触良好。特别是NAND Flash,引脚多、间距小,稍微歪一点就读不出来。
  • 备份原数据:在写入新固件前,一定要先读出原固件并备份。万一写错了,还能恢复。

2.3 JTAG/SWD接口调试:从“黑盒”到“灰盒”

编程器是离线操作,得把芯片拆下来。但有些场景下,你不想拆芯片——比如设备还在运行,或者芯片是BGA封装的,拆下来风险太大。这时候,JTAG或SWD接口就派上用场了。

JTAG(Joint Test Action Group)是一种标准的调试接口,思科设备上几乎都有。它通常有5根线:TMS、TCK、TDI、TDO、TRST(可选)。通过JTAG,你可以:

  • 读取CPU内部寄存器状态
  • 访问内存和外设
  • 暂停/恢复CPU执行
  • 下载和调试固件

SWD(Serial Wire Debug)是ARM公司推出的简化版调试接口,只用2根线(SWDIO和SWCLK),但功能跟JTAG差不多。思科很多基于ARM Cortex-A系列CPU的设备(比如Cisco ISR 1100系列)都支持SWD。

怎么找到JTAG/SWD接口?我一般这么干:

  1. 看PCB布局:JTAG接口通常是一排2x5或2x10的排针,旁边会有“JTAG”或“J”的丝印标记。
  2. 查原理图:如果能拿到设备的原理图(比如从网上泄露的文档里),直接搜“JTAG”或“SWD”关键词。
  3. 用万用表量:JTAG的TCK引脚通常有固定的时钟信号,用示波器或逻辑分析仪抓一下就能找到。
  4. 下面这张SVG图,展示了JTAG/SWD调试的基本流程:

    JTAG/SWD调试流程 调试主机 (OpenOCD/JLink) 调试器 (JLink/ST-Link) 目标设备 (思科路由器/交换机) Flash芯片 (NOR/NAND/SPI) 固件数据 (二进制镜像) 分析工具 (Binwalk/Ghidra) 通过JTAG/SWD接口,调试器可以直接访问CPU和Flash,实现固件在线提取 无需拆焊芯片,降低硬件损坏风险

    实际调试时,我常用OpenOCD配合JLink调试器。下面是一个简单的OpenOCD配置文件示例,用于连接思科ISR 1100系列设备:

    # OpenOCD配置文件 - Cisco ISR 1100
    source [find interface/jlink.cfg]
    transport select swd
    
    # 目标CPU: ARM Cortex-A9
    set CHIPNAME cortex_a
    source [find target/armv7a.cfg]
    
    # 连接设置
    adapter speed 1000
    adapter srst delay 100
    adapter srst pulse_width 100
    
    # 初始化
    init
    targets
    halt
    
    # 读取Flash内容
    flash read_bank 0 firmware.bin 0x00000000 0x1000000
    

    运行这个脚本后,OpenOCD会通过SWD接口连接到CPU,暂停CPU执行,然后从Flash的起始地址(0x00000000)读取16MB数据,保存到firmware.bin文件中。

    避坑指南:我曾经在调试一台Cisco Catalyst 3850交换机时,发现JTAG接口被禁用了。后来查资料才知道,思科从某个固件版本开始,会在Bootloader里关闭JTAG调试功能。解决办法是:先通过串口进入Bootloader模式,执行unlock jtag命令重新启用。嗯,这个坑我踩过,你们别再踩了。

    2.4 实战案例:从Cisco 2801路由器提取固件

    光说不练假把式。咱们来看一个完整的实战案例——从一台Cisco 2801路由器里提取固件。

    设备信息:

    • 型号:Cisco 2801
    • Flash芯片:Spansion S29GL256P(256Mb NOR Flash,3.3V)
    • 封装:TSOP-56

    操作步骤:

    1. 拆机:拧下路由器底部的螺丝,打开外壳。主板左上角就是Flash芯片,旁边有“U15”的丝印标记。
    2. 识别芯片:用放大镜看丝印,确认型号是S29GL256P。查手册得知,它是并行NOR Flash,16位数据总线,3.3V供电。
    3. 连接编程器:用RT809H编程器,选TSOP-56适配座。注意芯片的1号引脚要对准适配座的1号位置。
    4. 读取固件:打开编程器软件,选择芯片型号“S29GL256P”,点击“读取”。等待约5分钟,读出32MB数据。
    5. 验证数据:用Hex编辑器打开读出的文件,检查文件头。如果是思科固件,开头应该是“Cisco IOS”或“IOS”字符串。

    读出来的固件,就可以交给后面的章节去分析了。比如用Binwalk解包、用Ghidra反编译、找加密算法入口点……这些都是后话。

    关键点:固件提取的成功率,很大程度上取决于你对芯片和接口的理解。别指望一次就能成功,多试几次,积累经验。

    2.5 本章小结

    这一章,我们聊了Flash芯片的类型识别、编程器的选型与使用、JTAG/SWD接口的调试方法。说白了,就是教你怎么把固件从硬件里“抠”出来。

    我个人觉得,固件提取是整个逆向工程中最“接地气”的一环。它不像算法分析那么烧脑,也不像漏洞挖掘那么玄学,但它考验的是你的动手能力和细心程度。

    下一章,我们会进入更核心的内容——思科固件的加密算法识别。到时候,你会看到这些读出来的二进制数据,是怎么被层层加密保护的。

    好了,今天就到这里。如果你在实操中遇到什么问题,欢迎随时交流。记住:动手实践,才是最好的学习方式。


    公众号:蓝海资料掘金营,微信deep3321