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

admin 2022年11月13日16:47:53IoT评论10 views1567字阅读5分13秒阅读模式

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

本文为看雪论坛优秀文章

看雪论坛作者ID:不爱榴莲吖


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

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

操作示例:

1、 固件代码

找了一个FreeRTOS的示例工程,加入几行打印函数地址的日志:
关于thumb2指令下函数运行地址对齐问题及验证固件分析

2、 通过hex2bin将编译后的Hex文件转成二进制bin文件
执行情况:
关于thumb2指令下函数运行地址对齐问题及验证固件分析

3、 通过ue打开bin文件备用,如下:

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

4、 通过Keil-IDE加载测试代码,如下:

通过IDE debug调试后,板子reset之后在内部时序逻辑的控制下,将0x00000000地址的内容读取到SP;将0x00000004地址的内容读取到PC。此时SP中存放的是栈顶地址,PC中存放的是Reset_Handler复位处理函数地址。
关于thumb2指令下函数运行地址对齐问题及验证固件分析
关于thumb2指令下函数运行地址对齐问题及验证固件分析

5、 通过IDA Pro加载上述第二步生成的bin文件,配置过程如下:
关于thumb2指令下函数运行地址对齐问题及验证固件分析
关于thumb2指令下函数运行地址对齐问题及验证固件分析
通过在示例工程中的配置,来定义加载到IDA中的内存及存储映射地址,如下:
关于thumb2指令下函数运行地址对齐问题及验证固件分析
关于thumb2指令下函数运行地址对齐问题及验证固件分析

6、 ida加载后如下:
关于thumb2指令下函数运行地址对齐问题及验证固件分析

7、 顺利找到程序入口地址:

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

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

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

通过资料了解到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得到的。

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

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

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

最后,在ue中固件文件中也找到了相应的Delay_nS函数的入口地址,实际在flash中的地址也是+1的,如下图:
关于thumb2指令下函数运行地址对齐问题及验证固件分析



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


看雪ID:不爱榴莲吖

https://bbs.pediy.com/user-home-966145.htm

*本文由看雪论坛 不爱榴莲吖 原创,转载请注明来自看雪社区

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

看雪2022KCTF秋季赛官网:https://ctf.pediy.com/game-team_list-18-29.htm



# 往期推荐

1.CVE-2022-21882提权漏洞学习笔记

2.wibu证书 - 初探

3.win10 1909逆向之APIC中断和实验

4.EMET下EAF机制分析以及模拟实现

5.sql注入学习分享

6.V8 Array.prototype.concat函数出现过的issues和他们的POC们


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


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

球分享

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

球点赞

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

球在看


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

点击“阅读原文”,了解更多!

原文始发于微信公众号(看雪学苑):关于thumb2指令下函数运行地址对齐问题及验证固件分析

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年11月13日16:47:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  关于thumb2指令下函数运行地址对齐问题及验证固件分析 http://cn-sec.com/archives/1405908.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: