技术分享
论datasheet的重要性
2019-05-10 16:45

0x01前言

玩IoT安全的小伙伴必不可少的一项技能就是查datasheet,配合IDA等调试器的分析,本文以STM32F405BootLoader为例,简单的介绍了相关的分析流程。

0x02准备工作

分析STM32F405的BootLoader,需要datasheet,stm32的datasheet通过搜索引擎就可以轻松找到。

这是地址:https://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files/DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf

在datasheet中可以看到如下描述

1.jpg

说BootLoader位于systemmemory。那么systemmemory在哪呢

2.jpg

从上图可以知道systemmemory在0x1fff0000。所以,我们把0x1fff000到0x1fff77ff的内存里的数据都dump到stm32f405.bin中,然后可以做些检查了。比如使用strings

3.png

输出的很多字符串都没有意义,或许可以试试其他编码,在strings手册可以看到

4.png

所以使用-el再次运行,这次得到的结果就一目了然了

5.png

我们还可以检查代码是为哪种架构编译的,以及是大端序还是小端序等,可以使用binwalk检查。

6.png

从结果中可以看到,从offset0开始,引擎可以将字段读取为有效的小端Thumb指令,至少有1079个有效的指令。有了这些信息后我们接下来就可以通过IDA分析了。

0x03 IDA一把梭

打开IDA,可以看到如下窗口,我们需要设置如下

7.jpg

如果想只使用Thumb,而不是ARM的话,可以点击processoroption-》ARMspecific options

8.jpg

点击上图的红框

9.jpg

在上图窗口中将ARMinstructions设置为no。ThumbInstruction还是默认。一路点击ok。然后IDA再次弹窗,这次要求我们设置memory

0.jpg

我们已经知道BootLoader的地址是从0x1fff000开始的。我们我们在ROMstart address输入该值。在Loadingaddress也同样输入。

点击ok

然后会有小窗提示我们可以使用alt+G在ARM和Thumb指令集之间切换

二进制文件被加载后,点击一个地址,然后Alt+G,然后就会跳出如下窗口

11.jpg

Value0x1意味着在0x1fff0000后的代码会被作为Thumb来处理。其实这是反应ARM处理器的状态寄存器中的T标志位,如果T为1则表示正在执行Thumb,T为0表示正在执行ARM

当IDA出现下面的提示时

12.jpg

我们就需要手动找entrypoint了。一般通过查看中断向量表来查找。

我们只需要知道表中的哪个条目是Reset向量,因为Reset向量是我们的入口点。Reset向量是CPU将开始执行代码的地址。

STM32F405是Cortex-M4内核,所以查找Cortex-M4的向量表。

在Cortex-M4的用户手册中可以看到

13.jpg

在上表中,我们可以知道:在偏移0x0出的指针是初始栈指针的位置,在0x4是Reset向量,在0x8是NMI,NMI即Non-MaskableInterrupt,不可屏蔽中断。Reset是处理器启动时开始执行代码的地址。

在IDA中,我们可以将0x0,0x4,0x8等处的数据定义为“doublewords”(32位宽)。在0x1fff0000右键,选中doubleword即可

15.jpg

对0x4,0x8进行同样的操作,然后对应前面给出的表格添加注释

16.jpg

0x0偏移处的初始堆栈指针值指向我们SRAM的一块memory,所以这是有意义的。

0x4偏移处的Reset向量0x1FFF3DA1,也有自己的意义,选中就右键,选择jumpto operand

17.jpg

前面提到的Cortex-M4手册中已经说明,Restet的最低有效位增加了1,因此,实际的Reset向量是 Reset向量-1

18.jpg

熟悉IDA的师傅们一看IDA顶部的颜色是完全的灰黄色,这就说明到现在为止文件中还没有任何东西被定义

我们在Reset向量-1的位置单击,按下C,IDA就开始反汇编了

19.jpg

在上图中可以IDA顶部有些蓝色了,说明已经定义了很多子程序。针对向量表中其他的指针继续这么操作,可以得到进一步的结果

20.jpg

然后就可以开始研究固件内部复杂的工作机理了

21.jpg

在上图中,我们看到0x40023c04加载到r0中,然后值0x45670123和0xCDEF89AB依次写入0x40023C04的memory,红色底色显示的地址是将要访问的memory,其尚未映射到IDA文件中。也就是说,目前IDA文件中映射的0x40023c04没有memory。我们可以在STM32F4的datasheet中查找它的用途。

如下图所示,可以看到0x40023c04指的是Flash接口寄存器内存段中的某个地址。

22.png

如下图所示,还能知道:从0x40023c00基址偏移0x4是Flashkey regiter

23.jpg

第二个红框中是两个key值,它们是后续解锁flashcontrol register的关键。


0x04

本文通过strings,binwalk等工具进行准备工作,然后通过IDA分析IoT固件,并找到了后续针对解锁flashcontrolregister工作的两个关键key。这一切工作都离不开datasheet,文末还是要强调datasheet的重要性,对了,datasheet千千万,一定要对号入座,看准型号再找datasheet,而且datasheet基本没有通用性可言,切记切记~

另提一下可以得到datasheet的途径:

Google

去芯片制造商的官网

Yandex.ru

24.jpg

Emm,没错,是俄语的,相当于战斗民族的百度

在youtube上看iot安全的视频时,俄语出现的评率远大于英语

 4. 淘宝。淘宝上很多芯片都有卖,问问店家,一般都会给数据手册。在此感谢马云爸爸,这是我们安全研究人员的福报~

5. 其他途径,包括去细分领域的研究论坛,读源码等等,反正我碰到这种情况基本就放弃了Orz



参考:

https://www.pvsm.ru/stm32/163608

http://www.linfo.org/strings.html

https://www.pentestpartners.com/security-blog/

《idapro权威指南》

 

相关操作学习

IDA教程系列:学习IDA的使用方法和对程序分析的相关技巧。点击前往 合天网安实验室 开始操作!

 25.jpg

上一篇:无文件攻击的各种姿势
下一篇:Linux安全加固之中间件Tomcat
版权所有 合天智汇信息技术有限公司 2013-2018 湘ICP备14001562号-6
Copyright © 2013-2018 Heetian Corporation, All rights reserved
4006-123-731