首页
社区
课程
招聘
[原创]基于STM32F103C8T6的rtos系统逆向分析
发表于: 2024-7-25 11:32 3197

[原创]基于STM32F103C8T6的rtos系统逆向分析

2024-7-25 11:32
3197

前言

部分目标硬件系统为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直播授课

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//