1. 背景
调试样本时发现在某个函数时不能F5,显示positive sp value has been found。初步断定是因为堆栈不平衡导致的,因此需恢复堆栈平衡。
2. 恢复堆栈平衡
IDA->Option->General->Disassembly 勾选stack pointer,打开栈指针显示。
双击左下角output window报错位置定位到栈不平衡位置
在地址00407AE7处点击alt+k,将值设成018,保证00407AE7是034(实际上是-0x34)。
依次类推做加减,在00407AE7处用0x0平衡,因为add指令没有入栈,就还是0x34,依次将所有栈不平衡消除掉就可以F5了。
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。
那么根据这种理解,在00407AE7那个地址部分,因为执行完call了,栈就应该是034,也即是-04C+018=-034。所以要在00407AE7处点击alt+k,将值设成0x18。