😇
牛牛的安全 Odin
  • 个人介绍
  • 数据安全
  • 工控安全
    • 工控概念
  • 车联网安全合规
    • R155
    • CSMS\VTA
    • GDPR认证
  • 车联网安全
    • 漏洞订阅
    • 汽车攻击时间轴
    • 汽车信息安全研究
      • 车厂安全需求 Custom Requirement
      • 安全威胁
      • 参考文章
      • Who’s Behind the Wheel?
      • 安全研究基础
      • 智能网联汽车安全渗透指标
      • 智能网联汽车软件安全测试关键技术研究
      • 基于硬件在环的整车控制器功能安全测试技术研究
      • 智能网联汽车信息安全解决方案
      • 自动驾驶汽车的安全性-识别挑战
    • ECU逆向案例
      • 特斯拉攻击链
      • 汽车动力系统ECU固件逆向工程初探
  • 物联网安全
    • IoT 技术和协议
    • 智能设备常规测试思路总结
    • 各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
    • QEMU 系统仿真
      • 如何“用 QEMU 模拟它”
      • 处理加密的路由器固件
    • 自动分析Automated Approach
    • IOT渗透测试(一)
    • 物联网安全目录
  • 固件分析案例
    • 智能门锁、手环
      • MCU固件反汇编
      • 云丁鹿客门锁中bootloader和FreeRTOS的分析
      • 云丁鹿客门锁BLE通信的分析(下)
      • 云丁鹿客门锁BLE通信的分析(中)
      • 云丁鹿客门锁BLE通信的分析(上)
      • 华为智联旗下小豚AI摄像头的完整分析(下)
      • 华为智联旗下小豚AI摄像头的完整分析(上)
      • 海康萤石智能门锁的网关分析(4)
      • 海康萤石智能门锁的网关分析(3)
      • 海康萤石智能门锁的网关分析(2)
      • 海康萤石智能门锁的网关分析(1)
      • idapython编写和调试
      • 果加智能门锁的全面分析(下)
      • 果加智能门锁的全面分析(中)
      • 果加智能门锁的全面分析(上)
      • BLE智能手环
      • 耶鲁智能门锁的简单测试(下)
      • 耶鲁智能门锁的简单测试(上)
      • 耶鲁门锁漏洞
      • 对一款BLE灯泡的分析
      • BLE协议栈与Android BLE接口简介
    • 在IoT设备中查找端口对应进程的四种方法
    • 路由器命令执行
    • 对基于Philips TriMedia CPU的网络摄像机进行逆向工程
    • 从Microsoft Band以及 Hello Sense 设备中提取自己的历史数据
    • CVE-2021-22909- 深入研究 UBIQUITI 固件更新错误
    • 复现|摄像头固件重打包
    • Dlink_DWR-932B路由器固件分析
    • 针对小米九号平衡车的无接触式攻击
    • 记一次智能印章设备的漏洞挖掘
  • APP 逆向
    • Go二进制文件逆向分析从基础到进阶——综述
    • Switch APP逆向分析
  • 传统静态代码分析
    • 静态分析案例
      • ELF恶意软件的静态分析原理和方法(上)
      • ELF恶意软件的静态分析原理和方法(下)
    • 静态代码分析工具清单
    • 企业级静态代码分析工具清单
  • 应用安全测试
    • DAST、SAST、IAST
    • IAST 工具初探
  • 芯片架构
    • ARM指令集概念
    • ARM指令集
    • 冯·诺伊曼结构
    • 指令集
    • 处理器架构、指令集和汇编语言,三者有何关系?
  • 病毒分析
    • 熊猫烧香
  • 编程知识
    • REST API 教程
  • 流量分析工具
    • 卡巴斯基开源的智能手机流量劫持工具
    • 利用 Burp Suite 劫持 Android App 的流量(二)
    • 利用 Burp Suite 劫持 Android App 的流量(一)
  • 区块链安全
    • 安全多方计算
    • Chainalysis 团队从区块链的角度分析发现 2020 年最大的 4 起勒索软件攻击实现存在关联
  • 攻击案例
    • 特斯拉Powerwall网关可能受到黑客攻击
  • 移动应用
    • Mac上使用Charles抓包
    • 手机抓包工具汇总
    • APP渗透测试流程和技巧大全
    • 加壳和脱壳
    • 浅谈 Android Dex 文件
    • 移动应用漏洞分析样例分享
    • 移动应用常见漏洞分析
    • 移动应用漏洞分析工具介绍
    • 渗透测试流程详解 及 移动APP安全测试要点
    • Frida Android hook
  • 安全设计
    • 【软件安全设计】安全开发生命周期(SDL)
Powered by GitBook
On this page
  • 简介
  • 调试接口与调试器
  • 通过调试接口提取固件
  • 3.1 连接调试接口
  • 3.2 提取固件
  • 小结
  1. 固件分析案例
  2. 智能门锁、手环

云丁鹿客门锁BLE通信的分析(中)

Previous云丁鹿客门锁BLE通信的分析(下)Next云丁鹿客门锁BLE通信的分析(上)

Last updated 3 years ago

简介

上一篇文章中我们研究了Loock Touch门锁配套app中BleKey的获取流程,整个密钥分发和设备认证的流程都比较规范。接下来,我们将重点分析门锁固件对BLE通信内容的处理流程,开始分析之前,我们需要先获取门锁固件。

之前的文章我们已经介绍了两种获取固件的方法:在果加门锁的分析文章中,我们抓取了门锁向服务器请求固件更新时的数据包;在分析海康萤石网关时,我们直接读取了电路板上的Flash芯片。

但是以上两种方法都不适用于Loock Touch门锁,因为我们并没有找到鹿客门锁的固件更新接口,且门锁电路板上也没有外置的Flash芯片,固件是直接保存在MCU内置Flash存储器中的。所以我们在本篇文章中将分享一个新的方法:通过MCU的调试接口提取固件。

调试接口与调试器

在此前的文章中,我们已经介绍了通过gdbserver调试海康萤石固件程序的方法,通常情况下,gdbserver是运行于Linux系统环境中的调试器程序,通过使用Linux系统提供的调试接口以完成调试工作,并不需要太多硬件上的辅助。而在某些场景中,例如,没有Linux操作系统时,gdbserver等工具就无法满足我们的调试需求了,此时需要直接使用MCU提供的硬件调试接口和功能,以完成调试工作。通过阅读MCU的芯片手册,可以找到MCU提供的调试方式、调试引脚等详细信息。

为了使用MCU的调试接口,我们还需要与之对应的硬件调试器。与IDA、GDB等调试器软件类似,通过硬件调试器,我们也可以完全掌握被调试程序的执行状况。一般情况下,硬件调试器是通过USB接口连接到PC主机的,而硬件调试器与MCU之间的通信接口则有许多种。不同的MCU,支持的接口也不尽相同,具体信息需要查阅各芯片的手册。

本篇文章要研究的Loock Touch门锁使用的MCU型号为EFM32GG280F512,通过翻阅芯片手册,可以找到其调试接口信息如下图:

上图中的调试接口名称为SWD接口,常见的使用SWD接口的硬件调试器有JLink、STLink等。

我们目前使用的调试器SEGGER JLink(下文简称为JLink)提供了对JTAG和SWD两种调试接口的支持,具体使用时,只需要连接到对应的引脚即可,JLink中两种接口的引脚如下图所示:

通过调试接口提取固件

JLink调试器可以通过调试接口读写芯片内置的Flash,从而获取完整的固件。并不是所有芯片都可以通过调试接口提取固件,很多设备在发行版中启用了读保护(Readout Protection)机制,使得我们无法通过调试接口读到Flash内容,所幸本文中的设备并没有启用该机制。

接下来,我们就寻找并尝试用JLink连接芯片的调试接口。

3.1 连接调试接口

在门锁的电路板上,主控MCU一旁有一排过孔,我们已经在将排针焊接到这排过孔上了,如下图所示:

图中,左侧红框内就是我们焊上的排针,电路板上标注了排针对应的MCU引脚名称。经过万用表测量,可以确定红框中的IO和CLK引脚就是芯片的SWDIO和SWCLK两个引脚,我们在图2-1中提到这两个引脚是SWD调试接口的一部分,那么我们将这几个引脚按照如下图的方式连接到JLink调试器。

上图左侧是图3-1中的排针,右侧是SEGGER JLink的引脚。连接完成后,将JLink连接到电脑的USB口,并打开JLink Commander命令行工具(JLink的相关工具和使用手册等都可以在SEGGER的官网下载到:https://www.segger.com/downloads/jlink/),执行下图中的命令:

下面逐一解释上图中6个红框的内容:

(1)命令行工具开启时,会首先对JLink的状态进行检测(SEGGER官网的JLink,无论价格还是到货时间都不理想,所以我们选择了某宝,从这里打印的JLink固件信息来看,某宝的似乎是盗版产品);

(2)输入connect指令,控制JLink开始通过调试接口连接MCU;

(3)输入?指令选择要调试的芯片型号,在弹出的对话框中,我们按照芯片的厂商和型号,选择如下图的选项;

(4)输入s指令,选择调试接口的类型为SWD;

(5)选择接口的通信速率,一般保持默认即可;

(6)当出现第(6)步的这些内容时,说明JLink已经通过SWD接口连接到了MCU,接下来我们就可以读取固件或者进行调试了。

3.2 提取固件

上文提到,调试器可以读写芯片的内置Flash,而固件代码就存储在芯片内置Flash中,所以我们只需要将Flash中代码区域的数据读出并保存下来,就相当于拿到了固件。

按照我们分析果加门锁时的思路,翻阅芯片手册,可以确定代码存储在内存地址为0x0~0x100000的区域。我们通过JLink Commander命令行工具的savebin命令(该命令的使用方法可以去JLink的手册中查阅)将这一区域中的二进制数据保存下来。

上图中,我们拿到了固件代码,并将其命名为LoockEfm32Fw.bin。

3.3 解析固件

在拿到固件之后,我们需要解析固件并对其进行逆向分析。通过查阅手册可以知道,EFM32GG280的核心是ARM Cortex-M3,和果加门锁用到的STM32L0同属Cortex-M系列,所以我们可以按照果加门锁相关篇章中的方法配置IDA并载入固件。载入之后,继续沿用果加门锁分析时的思路,寻找Reset中断的中断服务程序,即偏移0x4地址处的数据,跳转之后按“c”键,IDA就会自动开始解析代码,如下图所示。

上文提到,代码存储在内存地址为0x0~0x100000的区域,所以图3-6中固件的基址为0x0。此前,我们在分析果加门锁时,将固件载入IDA时基址是0x08000000,因为在果加的案例中,代码存储区域的起始地址是0x08000000。

至此,我们成功提取并解析了Loock Touch门锁的固件,更加详细的分析工作将在下一篇文章中进行。

小结

本篇文章分享了如何通过调试接口提取芯片固件,而除了这个作用外,调试接口的主要功能是对MCU正在运行的程序进行调试,在后续文章中我们将通过JLink调试器分析门锁固件是如何处理BLE通信数据的。

此外,值得一提的是,对大部分芯片来说,只有芯片的读保护机制未启用时,才能通过调试接口提取它的固件,但是也有少数芯片的读保护机制是可以绕过的,这部分内容后续可能会以番外的形式进行分享,感兴趣的读者可以关注我们的后续文章。

图2-1 EFM32调试接口
图2-2 SEGGER JLink的引脚定义
图3-1 MCU及其部分接口引脚
图3-2 调试接口与JLink的连接
图3-3 使用JLink连接SWD接口
图3-4 芯片型号选择
图3-5 读取固件的二进制数据
图3-6 从Reset中断入手解析代码