STM调试技巧之栈逆向

STM调试技巧之栈逆向

HardFault_Handler说明STM32出现了硬件错误,为了解决HardFault_Handler问题,可以使用到栈回溯调试技巧。

先看个例子
在这里插入图片描述

A函数调用了函数B,B函数调用了函数C,但B函数在调用函数C时传入参数0,使得除数为0,发生HardFault_Handler。

一、函数调用过程

要搞懂逆向栈,也可以说回溯,首先要知道正向是怎样的一个过程:

当A函数调用B函数时,要将返回地址存放到LR寄存器中,这其实很好理解,简单来讲就是B函数干完了以后要回来继续干A,LR寄存器就存放了回来的地址。
在这里插入图片描述
ok,很简单对不对,让我们继续。A调用了B,LR寄存器中存了返回到A函数的地址;那么我们继续在B中调用C呢?返回到B函数的地址存在哪里?也存到LR寄存器吗?显然不行,里面已经放了返回到A函数的地址了,不能把它给覆盖了。

因此,我们需要在栈中先把LR寄存器里的值存进去,这是被调用函数第一步要做的事情。就拿A、B举例,A调用B后,B函数第一件要做的是不是去执行自己的代码,而是要在栈中保存好A函数的现场,可以看先反汇编文件。
在这里插入图片描述

反汇编文件中先将lr和r4入栈,然后再去执行其他指令,同样的,B调用C,C函数第一件事也是将lr以及其他寄存器的值入栈。
在这里插入图片描述

二、栈逆向的前置准备

当发生HardFault_Handler时,硬件还会自动将当前时刻的部分寄存器入栈,包括PSR寄存器、PC寄存器、LR寄存器等:
在这里插入图片描述
我们可以在做一些手脚,将r4-r11也存到栈里面去,方法就是修改启动文件中HardFault_Handler代码,它现在只做死循环实在是太浪费了:
在这里插入图片描述
汇编语言不太熟悉的可以让GPT去解释每一行的意思,上面片段的大体意思就是先判断使用的时MSP还是PSP,然后将r4-r11,exc_return入栈,跳转到rt_hw_hard_fault_exception。

rt_hw_hard_fault_exception相关代码可以参考如下:
在这里插入图片描述
exception_info结构体如下:
在这里插入图片描述
可以看出exception_info从exc_return到psr,就是按栈顶指针从低地址到高地址顺序排列的,这样的话我们通过访问此结构体就可以方便的知道各个寄存器的值。

三、栈逆向

好了,前置工作终于做完了,我们下载我们的代码,开打串口,不出意外我们可以看到如下信息,表示出现了HardFault_Handler错误:

在这里插入图片描述
ok,我们先看pc寄存器的值:0x008020e0,意思就是运行到这一地址时候出现了错误,我们打开dis反汇编文件,搜索0x008020e0(什么!反汇编文件不知道怎么生成?好吧,自己去搜寻一下吧,其实编译完成后的一条指令,根据axf文件生成dis文件)

在这里插入图片描述
可以看出是在C函数中出现了此错误,我们查看一下C函数的代码,发现没有什么问题,只是return了一个除数
在这里插入图片描述
既然发现不了问题那就继续往前追责吧,看看谁调用了C函数。从第一节内容我们知道这时候应该找返回地址,从C的放汇编我们也能看到第一句话就是PUSH {r4,lr},也就是说存放了两个寄存器(32bit)到栈中,一个是r4,一个是lr,就是这两:
在这里插入图片描述
显然0080020af是返回地址,我们继续在dis文件中搜寻,注意这个时候应该是搜0x008020ae,表示使用的是THUMB指令集。
在这里插入图片描述
好的,可以看到是C函数的返回地址指向了B函数,那么就说明B调用了C,C中出现了HardFault_Handler错误,我们再来看看B调用C有没有什么问题:
在这里插入图片描述
破案了,原来B调用C时,传入的参数是0,0是不可以做除数的,这才导致出现了HardFault_Handler。

当然,你可以继续向上追溯,看看谁调用了B,原理都是一样的。

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值