行业新闻

论datasheet的重要性

论datasheet的重要性

原创:合天智汇

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中可以看到如下描述

image.png

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

image.png

从上图可以知道systemmemory在0x1fff0000

所以,我们把0x1fff000到0x1fff77ff的内存里的数据都dump到stm32f405.bin中,然后可以做些检查了。

比如使用strings

v2-259fd8886f4cd09126e94b4489429458_hd.w

输出的很多字符串都没有意义,或许可以试试其他编码

在strings手册可以看到

v2-6347ee4a19084cc737695dfecf564b9c_hd.w

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

v2-60080f23564058d537cae47dac625638_hd.w

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

v2-7bdc1c6ffd2bf30811d554e05580a8c9_hd.w

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

0x03 IDA一把梭

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

image.png

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

v2-23f2b3439e73645814712fa3e3f9818b_hd.w

点击上图的红框

v2-ca69e7a60e2a48cd8c76c234c418069b_hd.w

在上图窗口中将ARMinstructions设置为no。ThumbInstruction还是默认。一路点击ok

然后IDA再次弹窗,这次要求我们设置memory

v2-f169f5a51f18d4b0433b6fd2b321de67_hd.w

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

点击ok

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

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

image.png

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

当IDA出现下面的提示时

image.png

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

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

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

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

v2-30f48ff5a9a3879771f18fecb213a118_hd.w

v2-2c95c5051a5c594c058d225d593b80d7_hd.w

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

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

v2-4363297d927bf5e62dc01896563076e7_hd.w

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

v2-6516a6a86d055b288beb5141138052dc_hd.w

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

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

v2-16179ded7e777539f5ee948c7b4869df_hd.w

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

v2-bdbcc317d47f7a5418ed7d99aa49523d_hd.w

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

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

v2-4b16b8580c145a1b658539631bf4f4b5_hd.w

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

v2-887ca3c956cae7a9e21f644be270f942_hd.w

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

v2-f3f49d1dea06d94a26f1b46f075c88d3_hd.w

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

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

v2-cc7c761f8adb688900a3f90c256202bc_hd.w

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

image.png

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

0x04

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

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

  1. Google
  2. 去芯片制造商的官网
  3. Yandex.ru

v2-1fbe4200178c11f8bbebd0853ebf5038_hd.w

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

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

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

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

0x05

参考:

  1. https://www.pvsm.ru/stm32/163608
  2. http://www.linfo.org/strings.html
  3. https://www.pentestpartners.com/security-blog/
  4. 《idapro权威指南》

相关操作学习

IDA教程系列:学习IDA的使用方法和对程序分析的相关技巧。点击http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182014111317165000001

开始操作!

image.png

声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关,本文为合天原创,如需转载,请注明出处!

关闭