-
-
[原创]基于STM32F103C8T6的rtos系统逆向分析
-
发表于: 2024-7-25 11:32 2895
-
前言
部分目标硬件系统为rtos系统,使用binwalk等传统IOT分析工具无法分析,故需要从rtos正向开发的角度学习如何逆向rtos固件
正文
环境
Ubuntu 22.04
freeRTOS+libopencm3
https://github.com/ve3wwg/stm32f103c8t6
分析
编译过程就省略了,基本都是些安装环境的问题,这里直接看编译后生成的main.bin,同时需要对照着源码
这里需要对arm的系统流程有些了解,硬件启动后,固件会先确定栈的位置,然后执行reset_handler函数,由这个函数跳入到我们自己写的main函数,可以在freeRTOS目录下搜索startup_stm32f1*查看启动文件
打开启动文件后可以看到文件开头就已经说明了stm32f10x系列硬件的启动流程
文件接下来就是一大段ARM汇编了,由于本文只是学习逆向,故不对开发内容做深入讲解
这里对照IDA中的反汇编和.s启动文件
这里可以看到reset_handler函数刚开始时做了很多初始化操作,然后直接跳到了main函数,注意这里使用的是bl跳转,意思也就是main执行完毕后还需要跳转回启动程序,不同的启动程序是不一样的,也有直接b且不返回的;还有一点就是这里没有看到初始化堆的内容,也就是说针对stm32f10x系列芯片是没有堆的内容的
搜索freeRTOS系统中所有的boot程序
可以看到这里的boot程序非常多,针对不同的芯片,就需要重新写一个关于目标芯片的.s启动程序,所以这里针对stm32f10x的学习仅仅只是针对这款芯片,遇到实际商业产品并不能直接拿来用,不过据我观察,stm32系列芯片的启动流程大同小异,不知道其他商业芯片启动是否相同,下图是stm32f10x的启动流程(启动流程太长,截图截不下)
最后可以尝试一下binwalk和其他传统工具,看看是否能识别出固件结构
可以看到传统工具是完全无法识别的
至于RAM和ROM的起始地址,用IDA打开bin文件,在开始位置按D两到三下,看到DCB变成DCD了就行
看到这里是不是就感觉很熟悉了,和上面在源码里截图的启动流程很相似了,开头的0x20005000就是栈的位置,说明ROM起始为0x20000000,大小是0x5000,RAM起始为0x8000000,至于大小,IDA会自动分析,除非十分确定,否则不要修改;修改完成后IDA就能直接分析出大量函数了,顺带的reset_handler的位置也可以分析出来
结尾
参考链接:https://bbs.kanxue.com/thread-247140.htm
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [翻译]fuzzer开发4:快照、代码覆盖率与模糊测试 2287
- [翻译]fuzzer开发 3:构建 Bochs、MMU 和文件 IO 1736
- [翻译]fuzzer开发 2:沙盒化系统调用 1737
- [翻译]fuzzer开发 1:一个新机器 2031
- [推荐]我的翻译索引贴 1151