关于“sp-analysis failed为什么只需要检查、修改出口retn与假出口retn的sp,而无需过分检查中间流程的sp”一问的自问自答

发布于 2021-08-11  46 次阅读


首先是sp-analysis failed 的一些形成原因

又学到了一些花指令

简单来说就是retn被当作普通jmp使用来加花时,函数假出口点会导致 sp-analysis failed

此时我们需要让IDA认为假出口只是一个普通的jmp,而普通的jmp不会影响栈,所以我们只需要先在假出口处平衡一下

至于函数入口和假出口之间,一般不会有什么问题

本文主要解答的是假出口和真出口之间为什么不用一一检查

原因就在于待分析对象一定是能运行的,换句话来说他在动调时栈一定是平衡的,只是在递归下降分析算法中分析错误而已,所以中间的内容一定是“事实上的栈平衡”

实际上,在真出口处也是事实上的平衡,我们只需要让IDA能够正确分析出来真出口就行,中间的部分就算分析出来的sp错误也不影响,因为我们只需要让函数的大括号闭合,而内部的东西可以让IDA单纯认为是越界使用堆栈,而众所周知,汇编是一种不检查越界的语言(别杠保护段)