前言

“智能家居增长潜力巨大,对拉动新兴消费意义重大。”
“此次疫情催生了‘宅经济’,这其中,智能家居无接触式的交互方法,为疫情时代的人们带来了便捷舒适而又安全智能的生活体验。”

第十三届全国人大代表——郑杰

“万物互联”从一种畅想变为实际落地场景,使联网终端的设备种类变得更加多样,智能家居市场的规模也在短时间内快速膨胀,如智能门锁、智能照明、智能家电、智能中控、智能影音等。据统计,2019年中国智能家居市场出货量突破2亿大关,较上年提升33.5%,预计今年我国智能家居市场规模将达到6000亿元。

作为从外部环境进入智能家居场景的第一个“关卡”,智能门锁的发展备受瞩目。

智能锁市场发展前景

随着物联网各类技术的逐步进步,越来越多的智能设备出现在我们生活中,智能锁在锁具市场上所占的份额将会越来越大,甚至超过传统锁,成为主流。

2016年全球市场智能锁产业规模达到1100万套。其中日本达到150万套,韩国达到170万套,欧美市场达到250万套,中国达到350万套,其它等市场约200万套, 预计到2020年全球智能锁产业规模将达到5100 万套 。

img

img

智能锁具产品分析

img

我国的智能锁大多数采用密码、指纹、手机等多种识别方式。其中,半导体指纹识别和光学指纹识别,是目前我国智能锁行业最主流的的指纹识别技术。

随着智能锁相关技术的日益成熟和发展,人脸识别、手机开锁、虹膜开锁、物联网技术等相继诞生,我国智能锁产品的功能和应用将更加丰富多元,也将进一步促进未来智能锁与智能家居的同步发展和高度融合。

智能锁市场消费因素分析

根据消费者的考虑因素以及智能门锁行业的发展趋势,安全、便捷和适用将会成为产品主流,行业将会出现以消费者主导的消费者品牌,而不是行业品牌,这就要求相关企业要足够洞悉消费者的心理。而最受消费者在意的安全性,将会得到进一步的强化,逐渐在真正意义上彰显智能门锁是人们隐私的保护神这一角色。

img

根据消费者购买智能门锁考虑因素的调查结果显示,86.8%的消费者最重视智能门锁的安全性,其次消费者考虑最多的便是实用性和便捷性,最后就是质量。

以上内容是对近期智能锁具发展趋势的简要分析,在后续发布的《锁王创造营》系列文章中,我们将从各个角度结合实际案例来讲锁具的安全性。上期的锁王闯关环节中,我们成功破解了第三关——“Hanoi”,现在我们来继续破解第四关:

第四关:Cusco

img

Cusco是Microcorruption第四个关,该关卡作为Hanoi的延续,让我们开始吧。

Cusco

首先我们浏览一下手册,看该版本更新了哪些内容。

OVERVIEW

  • We have fixed issues with passwords which may be too long.
  • This lock is attached the the LockIT Pro HSM-1.

DETAILS

This is Software Revision 02. We have improved the security of thelock by removing a conditional flag that could accidentally getset by passwords that were too long.

也就是说这一关卡还是使用了HSM-1,还删除了条件标志来提高安全性,从而避免密码太长而覆盖。

查看反汇编窗口,首先main函数,跟之前Hanoi一样,这里只调用了login函数。

1
2
4438 <main>
4438: b012 0045 call#0x4500 <login>

login函数代码如下,调用了putsgetsntest_password_valid以及unlock_door,看起来没有什么特别之处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
4500 <login>
4500: 3150 f0ff add#0xfff0, sp
4504: 3f40 7c44 mov#0x447c "Enter the password to continue.", r15
4508: b012 a645 call#0x45a6 <puts>
450c: 3f40 9c44 mov#0x449c "Remember: passwords are between 8 and 16 characters.", r15
4510: b012 a645 call#0x45a6 <puts>
4514: 3e40 3000 mov#0x30, r14
4518: 0f41 movsp, r15
451a: b012 9645 call#0x4596 <getsn>
451e: 0f41 movsp, r15
4520: b012 5244 call#0x4452 <test_password_valid>
4524: 0f93 tstr15
4526: 0524 jz#0x4532 <login+0x32>
4528: b012 4644 call#0x4446 <unlock_door>
452c: 3f40 d144 mov#0x44d1 "Access granted.", r15
4530: 023c jmp#0x4536 <login+0x36>
4532: 3f40 e144 mov#0x44e1 "That password is not correct.", r15
4536: b012 a645 call#0x45a6 <puts>
453a: 3150 1000 add#0x10, sp
453e: 3041 ret

我们从何下手呢?还记得上一关卡Hanoi时,我们知道当我们输入内容过长时,可能覆盖它后面的内存数据,所以,首先看看getsn函数接收的输入长度以及缓冲区的位置。

1
2
3
4514: 3e40 3000     mov#0x30, r14
4518: 0f41 movsp, r15
451a: b012 9645 call#0x4596 <getsn>

也就是说最大可接收0x30字节的输入,以及它存放在当前栈空间中,尝试输入若干个“A”,测试一下看看它是否会覆盖什么。

img

从内存中可以看到确实是0x30字节,但也没有什么重要的信息,继续运行。

img

密码错误,但是我们发现控制台窗口有一个报错,地址未对齐。原因是,我们查看上面的寄存器窗口,pc寄存器是0x4141,这不是“A”的16进制吗,正是我们输入的密码,0x4141并未16为对齐。

当我们在反汇编窗口向上拉,overvriteen表示原本的代码被覆盖了。基于以上说明,我们输入的内容更改了pc寄存器,并且已经溢出了当前的栈帧外,覆盖了我们的代码。

img

很明显,这是一个栈溢出漏洞,我们在login函数的ret指令处下断点,并运行到ret指令的地址0x453e。

img

sp寄存器指向的正是login的返回地址,关于ret指令的作用,msp430手册中说明,将当前sp指向的栈中的返回地址移动到pc寄存器,也就是相当于popjmp的操作,所以可改变程序的执行流程。

img

至于为什么会覆盖返回地址呢?首先我们查看login的栈的空间结构,如图左,栈是从高地址向低地址递进。当main函数call login时,首先将当前pc的下一条指令地址放入堆栈栈中,接着login函数第一条指令add #0xfff0, sp用来开辟0x10字节大小的栈空间。但是由于我们输入了0x30字节的输入,当前栈空间不足以存放这么多数据,就会向高地址溢出,覆盖返回地址以及代码。

img

既然返回地址被我们输入的数据覆盖,那么我们就利用这一点,来达到劫持程序流程的目的。首先我们确定返回地址的偏移,返回地址在0x43fe的位置,而我们的密码在0x43ee,所以它的偏移在+0x10的位置。确定偏移后,需要填充返回地址,返回时执行我们希望执行的代码,既然我们的目的是解锁,那么不如将unlock_door解锁函数的地址0x4446作为填充。

1
2
3
4
5
4446 <unlock_door>
4446: 3012 7f00 push#0x7f
444a: b012 4245 call#0x4542 <INT>
444e: 2153 incdsp
4450: 3041 ret

解锁

一切准备之后,开始进行栈溢出漏洞利用,别忘了返回地址的字节序。

使用十六进制输入:414141414141414141414141414141414644。

img

解锁成功!

img

以上就是本期《锁王创造营》的全部内容,对闯关以及其他问题感兴趣的小伙伴可以加一下我们的技术交流群哦!

img

参考

  1. MSP430 用户指南 http://www.ti.com.cn/cn/lit/ug/zhcu032i/zhcu032i.pdf
  2. 智能锁具攻防一:初探 https://yaseng.org/intelligent-lock-attack-and-defense-1.html
  3. 智能锁行业安全分析报告 https://yaseng.org/intelligent-lock-industry-safety-report.html
  4. 物联网安全百科 https://iot-security.wiki