Loading
0

看我如何让破解微软手环

这个学期我因为一个项目而得到了一个微软手环。最初的目的很简单:了解手环客户端的通信情况。不过因为兴趣,我想对其进行破解。很感谢OSIRS实验室的朋友给我了很大的帮助,感谢我的队友,还要感谢我的导师 mongo ,他不断地鼓励我,教了我许多东西,再次感谢你们。

首先,我需要弄清楚手环的一些基本特征。例如它是如何更新固件,如何上传用户状态等。很幸运,这个客户端是一个Windows二进制文件,所以我不需要像逆向一个Android app或者 ios app一样去搭建专门的环境。( 点击下载此Windows客户端 )。这个客户端是由C#编写的,所以我们可以使用ILSpy, JustDecompile, dnSpy和dotPeek等工具很容易地去调试和反编译它。

在对 客户端 进行简单的分析之后,我发现它从云端下载了FirmwareUpdate.bin,并将其存储到了这个文件夹:

c:/Users/IEUser/AppData/Local/Microsoft/CargoDevice/u_9e35ffc6-2859-4332-b89c 9110db164d9c/d_ffff1300ffffffff1830454e06000e30/FirmwareUpdate

现在我已经知道升级固件的保存位置了,下一步我要尝试去得到这个文件。很不幸,因为我的手环固件是最新的,所以我不能再下载新的固件了!不过我决定尝试着去欺骗一下服务器。

 

我使用Burp将请求中的版本号修改成较老的版本号,结果成功地下载到了FirmwareUpdate.bin 。有了它,我就可以继续做一些更有趣的事情了。

首先,我需要对FirmwareUpdate.bin进行简单的分析。

b0n0n@DM ~/MS_band $ binwalk FirmwareUpdate.bin DECIMAL HEXADECIMAL DESCRIPTION
-------------------------------------------------------------------------------- 29668 0x73E4 LZMA compressed data, properties: 0xA2, dictionary size: 2097152 bytes, uncompressed size: 1966105 bytes 30069 0x7575 CRC32 polynomial table, little endian 244521 0x3BB29 SHA256 hash constants, little endian 853728 0xD06E0 LZMA compressed data, properties: 0xA2, dictionary size: 2097152 bytes, uncompressed size: 1966105 bytes 939669 0xE5695 CRC32 polynomial table, little endian 

根据binwalk的显示结果我在网上进行了搜索,但是没有什么有趣的发现。所以我决定去逆向FirmwareUpdate.bin 格式,猜测这个文件中不同段程序的位置。我注意到FirmwareUpdate.bin的大小(0x16D67E字节),被储存在头部偏移量0×13的位置。

 

因为binwalk显示有一个CRC-32多项式表,我决定寻找这个4字节的CRC校验和,它被储存在头部用来进行完整性校验。你可以在头部看到有4个”随机”字节的数据(0×17,  0x431E23C3)。使用’  ‘替换这四个字节,重新计算剩下的数据的CRC,我们得到了完全相同的值:

Found at offset dec=23 hex=00000017

CRC=431E23C3

这个二进制文件似乎是通过CRC校验和来检查FirmwareUpdate.bin的完整性的。下一步我要尝试着将修改后的固件推送到我的手环上。作为测试,我将FirmwareUpdate.bin 中的版本号进行了修改,以此来观察手环是否会接受一个被任意修改后的FirmwareUpdate.bin。届时,手环的屏幕上会显示版本号,这样我们就能很容易地知道手环是否接受了这个 FirmwareUpdate.bin。

 

不幸的是,我意识到每当更新过程开始时,客户端都会先进行检查,以确保固件没有被损坏或者被篡改。为了绕过它,我使用Dnspy设置了断点,然后在客户端将固件发送给智能手环之前修改了它。

 

C#函数:将固件推送至智能手环

然而,当我完成这一切之后,我并没有在手环的屏幕上看到更新界面,这意味着我失败了。似乎还有其它的机制来校验固件的完整性。这意味着我必须回过头继续去逆向这个固件。我发现,在binwalk标记为LZMA数据的块中貌似有一些代码。不过首要问题是我不知道这个文件的加载地址,不过在读完 Reversing Embedded ARM of Cortex M Series 这篇文章后,我幸运的发现了正确的加载地址:0x05c8bf。

 

我终于可以将这个文件加载到IDA了,根据immediate value 0×17的使用位置,我找到了main CRC检验函数,继而发现了IntegrityCheck函数,还有其它的检验函数,整个完整性检验过程如下:

1.校验main CRC

 

2.校验块CRC

 

3.校验更新版本号是否比原版本号大

 

接着我要做的就是修改固件中的版本号(比手环上版本号大),然后按自己的喜好修改固件,最后重新计算块的CRC(在逆向代码基础上发现的位置)和main CRC。

为了方便,我给固件的一些二进制类型写了解析器。

 

接着,我写了一个简单的补丁,用来修改版本号和我想要修改的字符串。

 

你可以在 github 找到这些脚本。

修改了之后,使用相同的方法将固件推送到设备上。

 

当设备接收到这个文件之后,就开始校验其完整性,如果通过了所有的校验,手环就开始更新了,你会看到如下的安装符号:

 

安装

接着,智能手环将会重启,然后你会发现,版本号和其它一些东西都被修改了。

 

版本号

 

越狱

利用这种的方法,你可以修改手环中的任意代码和数据。

我没有买微软手环2,去测试是否这个方法对其同样适用。如果有人对进一步研究它有兴趣,可以留意手环Windows客户端一个很有趣的函数,但在这之前你需要先解锁它。

【声明】:8090安全小组门户(https://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们:邮箱hack@ddos.kim,我们会在最短的时间内进行处理。