【智能设备-基于STM32F103C8T6的rtos系统逆向分析】此文章归类为:智能设备。
前言
部分目标硬件系统为rtos系统,使用binwalk等传统IOT分析工具无法分析,故需要从rtos正向开发的角度学习如何逆向rtos固件
正文
环境
Ubuntu 22.04
freeRTOS+libopencm3
https://github.com/ve3wwg/stm32f103c8t6
分析
编译过程就省略了,基本都是些安装环境的问题,这里直接看编译后生成的main.bin,同时需要对照着源码
![](https://gitcode.net/pureGavin/photo/-/raw/master/IOT/stm32f10x/1.png)
这里需要对arm的系统流程有些了解,硬件启动后,固件会先确定栈的位置,然后执行reset_handler函数,由这个函数跳入到我们自己写的main函数,可以在freeRTOS目录下搜索startup_stm32f1*查看启动文件
![](https://gitcode.net/pureGavin/photo/-/raw/master/IOT/stm32f10x/2.png)
打开启动文件后可以看到文件开头就已经说明了stm32f10x系列硬件的启动流程
![](https://gitcode.net/pureGavin/photo/-/raw/master/IOT/stm32f10x/3.png)
文件接下来就是一大段ARM汇编了,由于本文只是学习逆向,故不对开发内容做深入讲解
这里对照IDA中的反汇编和.s启动文件
![](https://gitcode.net/pureGavin/photo/-/raw/master/IOT/stm32f10x/4.png)
这里可以看到reset_handler函数刚开始时做了很多初始化操作,然后直接跳到了main函数,注意这里使用的是bl跳转,意思也就是main执行完毕后还需要跳转回启动程序,不同的启动程序是不一样的,也有直接b且不返回的;还有一点就是这里没有看到初始化堆的内容,也就是说针对stm32f10x系列芯片是没有堆的内容的
搜索freeRTOS系统中所有的boot程序
![](https://gitcode.net/pureGavin/photo/-/raw/master/IOT/stm32f10x/5.png)
可以看到这里的boot程序非常多,针对不同的芯片,就需要重新写一个关于目标芯片的.s启动程序,所以这里针对stm32f10x的学习仅仅只是针对这款芯片,遇到实际商业产品并不能直接拿来用,不过据我观察,stm32系列芯片的启动流程大同小异,不知道其他商业芯片启动是否相同,下图是stm32f10x的启动流程(启动流程太长,截图截不下)
![](https://gitcode.net/pureGavin/photo/-/raw/master/IOT/stm32f10x/6.png)
最后可以尝试一下binwalk和其他传统工具,看看是否能识别出固件结构
![](https://gitcode.net/pureGavin/photo/-/raw/master/IOT/stm32f10x/7.png)
可以看到传统工具是完全无法识别的
至于RAM和ROM的起始地址,用IDA打开bin文件,在开始位置按D两到三下,看到DCB变成DCD了就行
![](https://gitcode.net/pureGavin/photo/-/raw/master/IOT/stm32f10x/8.png)
看到这里是不是就感觉很熟悉了,和上面在源码里截图的启动流程很相似了,开头的0x20005000就是栈的位置,说明ROM起始为0x20000000,大小是0x5000,RAM起始为0x8000000,至于大小,IDA会自动分析,除非十分确定,否则不要修改;修改完成后IDA就能直接分析出大量函数了,顺带的reset_handler的位置也可以分析出来
结尾
参考链接:https://bbs.kanxue.com/thread-247140.htm
更多【智能设备-基于STM32F103C8T6的rtos系统逆向分析】相关视频教程:www.yxfzedu.com