• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

IDA系列教程:堆栈平衡原理与手动恢复平衡

IDA系列教程 云涯 4年前 (2020-06-19) 3806次浏览

1. 背景

调试样本时发现在某个函数时不能F5,显示positive sp value has been found。初步断定是因为堆栈不平衡导致的,因此需恢复堆栈平衡。

images

2. 恢复堆栈平衡

IDA->Option->General->Disassembly 勾选stack pointer,打开栈指针显示。

images

双击左下角output window报错位置定位到栈不平衡位置

images

在地址00407AE7处点击alt+k,将值设成018,保证00407AE7是034(实际上是-0x34)。

images

依次类推做加减,在00407AE7处用0x0平衡,因为add指令没有入栈,就还是0x34,依次将所有栈不平衡消除掉就可以F5了。

images

3. 原理分析

堆栈是从高地址向低地址延申。在004079E5处alt+k打开stack pointer,看到弹出“change sp value”窗口。Current SP value(当前SP值)显示0x0,DIFFERENCE between old and new SP(新旧sp的区别)为-0x4。可以这样理解,在没有push 10h之前sp为0,然后push 10h,栈指针向低地址方向扩展4,所以在push offset stru_4084F0之前是004,等到执行push offset stru_4084F0之后,栈指针就指向008。

images

那么根据这种理解,在00407AE7那个地址部分,因为执行完call了,栈就应该是034,也即是-04C+018=-034。所以要在00407AE7处点击alt+k,将值设成0x18。

images

 


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:IDA系列教程:堆栈平衡原理与手动恢复平衡
喜欢 (2)