关于thumb2指令下函数运行地址对齐问题及验证固件分析

news2024/10/6 16:17:49

近期,在分析Thumb2指令的一个固件文件时,发现Thumb2指令集下执行函数的运行地址不对齐?

于是,为了分析一下原因,找了手头上现有的一款基于Cortex3内核的一块板子来实际执行看一下,结合编译后的Hex文件,通过IDA来进一步验证一下Thumb2运行地址不对其的现象。

操作示例:

  • 固件代码

找了一个FreeRTOS的示例工程,加入几行打印函数地址的日志:

1666926068_635b45f4e2399c170c40d.png!small

  • 通过hex2bin将编译后的Hex文件转成二进制bin文件

执行情况:

1666926085_635b4605be7806fe44221.png!small

  • 通过ue打开bin文件备用,如下1666926167_635b4657340201244067c.png!small
    * 通过Keil-IDE加载测试代码,如下:

通过IDE
debug调试后,板子reset之后在内部时序逻辑的控制下,将0x00000000地址的内容读取到SP;将0x00000004地址的内容读取到PC。此时SP中存放的是栈顶地址,PC中存放的是Reset_Handler复位处理函数地址。

1666926217_635b46890b6a30a71df34.png!small1666926222_635b468ea62827b73f0d2.png!small

  • 通过IDA Pro加载上述第二步生成的bin文件,配置过程如下:1666926770_635b48b210ddf4314c2ee.png!small1666926776_635b48b8049b96d062afd.png!small

通过在示例工程中的配置,来定义加载到IDA中的内存及存储映射地址,如下:

1666926788_635b48c4943454a04b403.png!small1666926797_635b48cd0c686e801f0eb.png!small

  • ida 加载后如下:1666926807_635b48d7dc6f496d42cf5.png!small
  • 顺利找到程序入口地址:1666926834_635b48f2676d50a25465c.png!small1666926848_635b49008ac77f67cd39c.png!small

进而找到main函数的执行地址,发现通过ldr加载到寄存器时的地址为main函数真正地址+1;通过debug,也可以验证,如下:

1666926860_635b490c36bee96286f3a.png!small1666926865_635b4911f36fe9c5942ca.png!small

通过资料了解到ARM指令是4字节对齐的,Thumb-2指令是2字节对齐的,所以这里main函数和函数Delay_nS的地址应该是2字节对齐的,但是打印出来的值却是:08000BB1和080002D9。main函数的地址和test函数的地址都成了奇数地址了。

这个问题在于有些ARM处理器即能使用ARM指令,又能兼容Thumb指令,同一个应用程序中可能同时存在ARM指令和Thumb指令,这两者的处理方式肯定是大不相同的,所以为了切换ARM状态和Thumb状态,在跳转到Thumb指令编写的代码块的时候,将程序地址的最低位置1(因为不管是ARM指令还是Thumb指令,都至少是2字节对齐的,所以最低位一定是0,所以最低位可以拿来用于区分ARM状态和Thumb状态),这样处理器识别到最低位为1的话就会切换到Thumb状态,否则则是ARM状态。Thumb2指令集也是为了兼容以前的ARM状态和Thumb状态所以这样做的。

所以编译器编译STM32F1的程序的时候,会把函数的真实地址 加上1
作为常量放在ROM空间(如果这个函数的地址有被用到的话),获取函数的指针的时候就会获取到最低位被置1的一个地址。如下图,获取Delay_nS的地址的时候,到0x08000BC4地址处读取到了0x080002D9的值,这其实就是Delay_nS的真实地址0x080002D8

  • 1得到的。

1666926886_635b49268ca23acb2bddc.png!small

程序debug,打印出的日志如下:

1666926896_635b493079a44fe6cda3a.png!small

最后,在ue中固件文件中也找到了相应的Delay_nS函数的入口地址,实际在flash中的地址也是+1的,如下图:

1666926909_635b493d4ad9100306df5.png!small

也是+1的,如下图:

[外链图片转存中…(img-RToHkpTx-1677132990290)]

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【扫下方二维码】免费领取:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/366249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【性能测试】loadrunner(一)知识准备

【性能测试】loadrunner(一)知识准备 目录:导读 1.0. 前言 1.1 性能测试术语介绍 1.2 性能测试分类 1.3 HTTP我们需要知道的 1.4 Loadrunner 12.55安装 1.0. 前言 ​ 在性能测试中,牵扯到了许多比较杂的知识点,…

Java文件IO操作:File类的相关内容

Java文件IO操作一、File类1.相对路径和绝对路径2.路径分隔符(同一路径下、多个路径下)3.实例化4.常见方法一、File类 File类继承自Object类,实现了Serializable接口和Comparable接口; File类属于java.io包; File类是文…

高通平台开发系列讲解(WIFI篇)802.11 基本概念

文章目录 一、WLAN概述二、802.11发展历程三、802.11基本概念沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文将基于高通平台介绍802.11基本概念。 一、WLAN概述 WLAN是Wireless Local Area Network的简称,指应用无线通信技术将计算机设备互联起来,构成可以互相通…

Python计算 -- 内附蓝桥题:相乘,三角回文数

计算 ~~不定时更新🎃,上次更新:2023/02/23 🗡常用函数(方法) 1. 求一个整数的最末位 举个栗子🌰 n int(input()) end n % 10蓝桥例题1 - 相乘✖️ 题目描述 本题为填空题,…

【python学习笔记】:输出与输入

01 输出方式 表达式语句、print()函数和使用文件对象的write()方法。 02 输出形式 格式化输出str.format()函数、转成字符串可以使用repr()或str()函数来实现。 (1)repr():产生一个解释器易读的表达形式,便于字符串的拼接。 例:输出平方与…

OpenGL超级宝典学习笔记:着色器存储区块、原子内存操作、内存屏障

前言 本篇在讲什么 本篇为蓝宝书学习笔记 着色器存储区块 原子内存操作 内存屏障 本篇适合什么 适合初学Open的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重…

五月天演唱会门票开售,retry了一小时也没re进去!到底是什么高科技在作祟?!

等待了三年,大型线下演唱会终于回归了!前段时间,文化和旅游部市场管理司发布通知称,自2023年2月16日起,各地文化和旅游行政部门恢复对涉港澳台营业性演出的受理和审批。据中国演出行业协会在业内调研了解,周…

Python Pytorch开发环境搭建(Windows和Ubuntu)

Python Pytorch开发环境搭建(Windows和Ubuntu) 目录 Pytorch开发环境搭建 1. 安装cuda cudnn (1)Windows安装方法 (2)Ubuntu18.04安装方法 2. 安装Python(推荐使用Anaconda) (1)Windows安装方法 (2)Ubuntu18.04安装方法 3. Pytorch安装 4. 安装…

渗透测试之端口探测实验

渗透测试之端口探测实验实验目的一、实验原理1.1 端口1.2 服务二、实验环境2.1 操作机器2.2 实验工具三、实验步骤1. 使用netstat手动探测指定服务2. 使用namp工具进行端口扫描2. 使用ssh命令总结实验目的 了解端口、服务的基本概念熟悉手工探测方式netstat命令的使用掌握扫描…

分享app的测试技巧

前言 今天笔者想和大家来唠唠app测试,现在的app有非常的多,这些app都是需要经过测试之后才能发布到应用市场中,app已经成为了我们日常生活中不可或缺的一部分了,但它的功能必须强大,才能受到消费者的重视,…

Python开发——做一个简单的【表白墙】网站

前言 大家早好、午好、晚好吖 ❤ ~ 今天我们要用Python做Web开发,做一个简单的【表白墙】网站。 众所周知表白墙的功能普遍更多的是发布找人,失物招领, 还是一个大家可以跟自己喜欢的人公开表白的平台 Tornado框架简单介绍 在Python当中&…

Go全栈学习(一)基础语法

Go语言基础语法 文章目录Go语言基础语法注释变量变量的定义变量的交换理解变量(内存地址)匿名变量变量的作用域常量2023.2.4日 总结// 关于Goland 中 执行的问题// 1、包下执行 (一个 main 函数来执行,如果有多个,无法…

【Elasticsearch】安装配置与使用

一、下载与安装Elasticsearch下载地址:https://www.elastic.co/cn/downloads/elasticsearch#ga-release前端管理界面:https://github.com/mobz/elasticsearch-head这两个文件都是解压即可。二、配置与启动1.elasticsearch6以上的版本已经内置jdk&#xf…

跑步选什么耳机比较好、最好用的五款跑步无线耳机推荐

春节过后,全国各地马拉松蜂拥而起,跑友们憋了这么久终于可以参赛了,不过无论是比赛还是训练,在跑步的过程中都离不开音乐的加持,所以是时候为自己选一款好用的运动耳机了!说实话挑选一款适合的运动耳机还真…

mac下ElasticSearch 集群搭建,使用Kibana配置和管理集群

Elasticsearch如果做集群的话Master节点至少三台服务器或者三个Master实例加入相同集群,三个Master节点最多只能故障一台Master节点,如果故障两个Master节点,Elasticsearch将无法组成集群.会报错,Kibana也无法启动,因为…

Python入门(未完待续。。。)

认识python 解释型(写完直接运行)、面向对象的高级编程语言;开源免费、支持交互式、可跨平台移植的脚本语言;优点:开源、易于维护、可移植、简单优雅、功能强大、可扩展、可移植;缺点:解释型→运…

【IoT】无线温度采集系统设计

随着工业和农业的发展,无线采集系统的应用范围变得更加广泛,对无线数据采集系统的测量参数也越来越多,精准度也越来越高。目前国内外有很多的无线温度采集系统,但很多的无线温度采集系统存在很多问题,如采集速度和稳定…

docker网络基

本文简单介绍下,容器之间的网络访问、容器与宿主机之间的网络访问、宿主机上有哪些网络接口。lolocal的简写,本地回环地址,127.0.0.1,它代表本地虚拟设备接口,默认被看作是永远不会宕掉的接口eth0ethernet的简写&#…

OraDump导出套件

OraDump导出套件 只需单击几下即可将数据从Oracle转储文件导出到流行的数据库和格式。 OraDump Export Kit是一个将数据从Oracle转储文件导出到流行数据库和格式的软件包。该产品具有高性能,因为它直接读取转储文件。命令行支持允许编写脚本、自动化和安排转换过程。…

结构建模设计——Solidworks软件之装配体操作基本总结三(高级配合、机械配合、快捷菜单功能)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…