![7e5bd475b445ed69bc793801b205a695.png](https://i-blog.csdnimg.cn/blog_migrate/35cee4ea4342fb3ef579e5e05e87a61f.jpeg)
在最近的ctf比赛中,开始出现以stm32系列固件分析为代表的物联网安全类题目,由于这类问题涉及到嵌入式硬件、嵌入式系统等多方面的知识,未来出题、研究空间都非常广阔,这次就让我们借助题目一起来学习一下。由于考研失踪了很久,很多联系我的同学我也没能回复,希望大家原谅,之后一段时间我就正式回来啦。
啥是stm32?
STM32是一种功能强大的32位的单片机,它基于低功耗的ARM内核,由于它采取的Cortex的内核,性能比起传统的51单片机强了不知道多少倍,而且还提供了强大的外围设备,比如usb,这都是以往的单片机难以想象的。
除了性能、功能外,由于它模块化的理念,丰富的库,我们可以更多在软件层面开展工作,相对于51单片机庞大的电子电路知识来说,对我们这些计算机人友好不少。
当前,不管是工厂、自控设备、物联网终端等等,stm32所占的份额都在不断扩大,在安全领域,stm32也是越来越多出现在我们视野里,可以说,stm32成了物联网安全不得不碰的东西。
SCTF PassWordLock PLUS
先来看个实际的题目,它给了一个stm32f103c8t6的hex固件,描述是一个stm32连接了四个按钮,按照一定的顺序点击按钮就会输出flag。通过前一个SCTF PassWordLock可以得到按键的顺序,剩下的就需要我们自己分析了。
我会先用我们实际做题的思路来给大家分析这道题目,然后提出几个疑问,并在后续为大家解答。
我们可以用Frida或者IDA pro进行静态分析,因为Frida初始化工作较为简单,所以我们这里以IDA pro为例。首先我们需要设置处理器为ARM
![3f1eda928adb4b5c1ed17f4d54ec2a46.png](https://i-blog.csdnimg.cn/blog_migrate/7bafe0fc2868bf4acae0bf358d31608a.jpeg)
接着还需要点击processor option设置ARM的相关参数,这里要根据对应的stm32的架构进行选择,没得商量,这里是stm32f103c8t6查阅资料后确定这里是armv7-m、thumb-2(后面我会提到stm32的命名方法)。
![40d136a0bebe2b03d01824baaee2da2f.png](https://i-blog.csdnimg.cn/blog_migrate/4db01cf358e069e5896ad45f604c407f.jpeg)
接下来ida会问你固件ram、rom、Loading address,前两项分别代表着ram、rom的起始地址,第三项则是装载地址,一般是和rom地址相同(在stm32中,程序、bootloader会映射到ROM位置)。这里开发者可以自行设置,但默认值如下所示。
![fb98ce1bc2f66a32bd29ddde5d9d3f20.png](https://i-blog.csdnimg.cn/blog_migrate/cf8e2f77524ffa0e0431a5a187cf076e.jpeg)
图中为stm32开发工具mdk,当我们对一个项目进行编译、烧写时,可以自行设定其rom、ram的相关值,不过一般都是使用默认值,特别的是其中的ram size,他和我们使用的stm32设备的内存有关,比如常见的64k内存(后面我们也会说如何判断内存大小),即0x10000。
到此为止ida已经成功载入了文件,但是没有识别出来任何代码,只有一片一片的DCB,这个命令的意思是分配一段内存单元,并对该内存单元初始化,这里我们就不免联想到stm32开发时,会有个startup的过程,其中有一部分就是开辟一片空间并将函数地址放入,构建向量表,我们打开对比一下
![7f1ecb0d847daed6e8c0d5ca433eaade.png](https://i-blog.csdnimg.cn/blog_migrate/c6cd48104ccd0b6c63c9ff356208370b.jpeg)
这里是DCD,ida里是DCB,这两条指令的作用是一样的,只是数据长度不同罢了(stm32为32位机,自然应该是d的double word了),我们可以按d对数据长度进行转换,就可以得到DCD的代码,后面的即是各个函数的地址了,我们只需要一一对应即可。