😇
牛牛的安全 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
  • 简介
  • bootloader分析
  • FreeRTOS分析
  • 小结
  1. 固件分析案例
  2. 智能门锁、手环

云丁鹿客门锁中bootloader和FreeRTOS的分析

PreviousMCU固件反汇编Next云丁鹿客门锁BLE通信的分析(下)

Last updated 3 years ago

简介

在此前的文章中,我们已经分析过了云丁鹿客智能门锁,当时直接用SWD调试器定位到了关键代码,这种分析方法固然好,但却跳过了很多有价值的地方。本篇文章中,我们回过头来从另一个角度分析这个设备,即从设备上电开始的第一条代码开始分析,一点一点理解整个固件的内容。

bootloader分析

bootloader是设备上电之后首先运行的一段程序,它会完成必要的初始化操作,并引导操作系统的加载。在我们拿到设备固件,并顺利通过IDA载入固件之后,可以看到解析出的内容仅是完整固件的一小部分,而更多的固件内容还是未解析状态。这被解析出来的一小部分,其实就是设备的bootloader部分代码。

为帮助我们分析这个云丁鹿客的智能门锁,我们可以尝试接通设备的串口。串口的位置就在SWD接口的旁边,可以参考云丁鹿客智能门锁系列第二篇中的图3-1。此时,给设备上电,是可以看到串口有字符串输出的,如下图所示:

上图中,前几条字符串是可以直接在IDA中搜索到引用的,而剩下的字符串则未找到引用地址,如下图:

造成上图中现象的原因是,IDA仅仅解析了bootloader部分代码,这些字符串的引用代码刚好是bootloader部分输出的;其余字符串是由主程序输出的,IDA未能解析出主程序而导致这些字符串在代码中未被引用。上图中,程序最终进入sub_C44函数,如下图:

上图函数的功能很简单,即将0x4100存储到向量表偏移寄存器(0xE000ED08地址),也就是将0x4100地址的数据设置为新的中断向量表,随后调用sub_F0函数。

结合图2-3和图2-4,bootloader最后会把0x2001B860(0x4100地址处的值)设置为新的栈指针,并跳转到0x49ED(0x4104地址处的值)。从这之后bootloader就将MCU的控制权交给了主程序。

综上,设备上电后会首先执行bootloader,bootloader会在Flash中搜索、校验固件,校验完成后,会设置新的中断向量表并跳转至主程序的入口地址。

FreeRTOS分析

通过固件中的字符串可以推测出设备使用了FreeRTOS操作系统,该系统是一种很常见的开源实时操作系统,其官方主页是:https://www.freertos.org。在使用FreeRTOS系统的设备中,固件主程序是FreeRTOS系统内核代码和应用逻辑代码相互杂糅在一起的一个二进制文件,所以我们需要先设法将二者区分开来,否则就容易出现山总分析MFC42一样的错误。

FreeRTOS操作系统提供了任务管理的功能,而设备的逻辑功能就是由其中一个或多个任务(task)来实现的,所以应用逻辑代码必然在这些task的实现代码中。FreeRTOS系统创建任务的API如下图所示:

上图中,函数的第一个参数是该任务对应的函数指针,第二个参数是任务的名称,只要找到这个API的调用处,通过它的第一个参数就可以定位任务函数了。

由于FreeRTOS是开源的操作,我们可以使用源码编译生成一个带符号表的程序,进而利用IDA的bindiff插件对比识别固件中的FreeRTOS操作系统API。此处的bindiff插件是一款IDA插件,用于比较两个idb (IDA database)文件中的相似函数,常见于漏洞的补丁分析,其官方网址是https://www.zynamics.com/bindiff.html。按照官网的安装说明,下载相应版本的bindiff安装程序,完成安装即可使用。

为了提高bindiff插件对比的准确率,我们需要尽量选择与云丁鹿客近似的FreeRTOS版本,编译环境和配置也尽量靠近云丁鹿客的智能门锁。有趣的是,在我们搜索可用的源码过程中,意外地发现github上有一份代码与我们正在逆向分析的固件极其相似,链接是https://github.com/RunningChild/efm32_freertos_app,后发现该仓库的拥有者就是云丁鹿客的工作人员,这份代码是把关键应用逻辑代码全部删掉之后剩下的FreeRTOS框架。

顺利编译该项目之后即可使用bindiff插件做比较,具体编译方法和过程会在以后的文章中专门做整理和介绍,本篇番外中暂不做过多介绍,部分对比结果如下图所示:

上图中我们编译的固件中xTaskGenericCreate函数和原版固件中sub_34A50函数相似度非常高,可以判断sub_34A50函数就是FreeRTOS中创建任务的API接口,那么我们在IDA中查找sub_34A50函数的引用,某一处引用如下图:

上图中,sub_34A50函数的参数和图3-1中xTaskCreate的参数是吻合的;还可以判断出位于0x1B0A9地址处的函数负责的应该是BLE消息的接收和处理。在0x1B0A8地址处下一个断点开始调试,当手机app里点击开门按钮后就会触发断点,可以沿此线索继续往后分析。

由此我们可以确定sub_34A50函数就是固件用来创建任务的API,接下来只需要写一个简单的IDApython脚本,即可将固件中的所有任务都整理出来,并使IDA以这些任务的函数地址创建函数,脚本如图:

上图中的脚本运行结果如下:

注意,脚本功能依靠sub_34A50函数的交叉引用来实现,存在一些未被IDA识别的引用点,因此可能会漏掉一些task。至此,我们就可以随意分析云丁鹿客智能门锁中我们感兴趣的功能点了。

小结

到这里,我们的第二篇番外就结束了,关于云丁鹿客智能门锁的分析也就完全结束了。在这篇番外中,我们着重分析了设备启动后的bootloader代码以及FreeRTOS操作系统。作为一款开源的实时操作系统,FreeRTOS着实拥有不少的用户量,虽然分析起来要比嵌入式Linux操作系统的程序要麻烦一些,但仍然建议各位读者对其有一点简单的认识。

图2-1 启动时的串口输出
图2-2-2 字符串未引用
图2-3 sub_C44函数
图2-4 sub_F0函数
图3-1 FreeRTOS任务创建API
图3-2 bdiff部分结果
图3-3 sub_34A50的调用
图3-4 IDA解析任务入口函数的脚本
图3-5 脚本的结果输出