1
简介
2
SEGGER JLink的调试功能
3
翻阅门锁MCU的芯片手册可以看到,芯片提供了AES处理模块,该模块的内存映射如下图所示。
图3-1 EFM32中的内存映射
显然,我们假设鹿客门锁使用芯片的AES模块进行加解密操作,而不是自写AES算法,那么必然需要访问0x400E0000~0x400E0400这片区域中的内存地址,那么我们只要在设置适当的读写断点,然后等待手机与门锁进行通信时触发断点就可以了。
在断点设置区域右键,选择Set Data Breakpoint,会弹出如下图所示的窗口,
图3-2 设置数据端点
上图中的设置,表示当CPU向0x400E00XX地址写入数据时触发断点。
断点设置完成之后,在手机上点击开锁,由于我们设置的数据断点是监控一片内存区域,所以开锁过程中会多次被触发,后可以看到如下图左侧的一小段代码,右侧是执行到0xED0C地址时的寄存器数据。
图3-3 写入待解密数据的断点
上图中,0x400E001C地址(R0 + 28)是AES_DATA寄存器,这一小段代码所处的函数向AES_DATA寄存器写数据,应该就是AES的处理函数(下文以AESFunc代称)。回溯调用栈,可以找到调用AESFunc的外层函数,以及AESFunc函数的起始地址,进而使用IDA的F5功能对AESFunc函数进行分析,如下图:
图3-4 AESFunc函数的伪代码
结合芯片手册,由伪代码很容易能判断出AESFunc各个参数的作用,在本系列第一篇文章中,我们已经知道了开锁时的解密密钥就是BleKey,而门锁BleKey的获取过程,是由服务器下发一组数据totalData至手机app,app没有进行任何处理,直接通过BLE通信转发给了门锁。那么,接下来看一看门锁是如何处理totalData的。
3.2 门锁获取BleKey的过程
首先我们需要看一下,totalData的内容是什么,如下图所示:
图3-5 totalData字段及其base64解码数据
可以看到totalData是一串二进制数据经过base64编码后的结果,红框之前的部分可以视作数据的header,包含消息头、数据包序号、校验等内容, header之后的body部分,即红、蓝、黑框中的数据,这三组数据的结构是相同的,如下图所示:
图3-6 totalData中payload用到的数据结构
红框中data_type为0x03的数据,其data_content=0x5FFFECAE,该部分与AES根密钥密文有关。totalData的body部分还有两组数据,其具体作用不再详细说明,说太多有些不妥。
接着,我们在AESFunc的入口下一个断点,可以看到BleKey的值如下图所示:
图3-7 内存中的BleKey
从图3-5和图3-7中看不到BleKey和totalData之间的联系,想必totalData和BleKey之间还是经过了某些解密或解码转换,我们需要继续寻找门锁对totalData的处理过程。保持AESFunc函数的断点,在调试过程中可以发现totalData也是经过 AESFunc函数进行解密的。此时,回溯调用栈即可找到如下图所示的关键代码。
图3-8 totalData数据的处理
上图中的AESEntry函数为AESFunc的封装,这部分就是由totalData生成BleKey的核心代码,该流程可以整理为下图。
图3-9 BleKey获取流程图
在这个流程中,如果没有根密钥就无法解密BleKey,通过调试可以找到根密钥在Flash中的存储地址是0x7E09C。
4
总结
作者:Yimi Hu & Light @ PwnMonkeyLab
联系方式:
原文始发于微信公众号(胖猴实验室):[胖猴小玩闹]智能门锁与BLE设备安全第十五篇:云丁鹿客门锁BLE通信的分析(下)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论