前言:
很不争气的,在做第一天MBE课后练习lab1A时又卡住了,不想纯撸汇编,把程序扔到IDA中F5,发现不能反编译。经过搜索资料以及向学长请教,终于解决了这个问题,前来记录一下。由于知识有限,文中内容难免有错,请过往的大神们指教。
正文:
问题如下:
这种问题出现的原因如下:
一般是程序代码有一些干扰代码,让IDA的反汇编分析出现错误。比如用push + n条指令 + retn来实际跳转,而IDA会以为retn是函数要结束,结果它分析后发现调用栈不平衡,因此就提示sp analysis failed.
我还遇到过一种情况,是因为编译器优化,结果IDA无法正确识别一个函数体的结尾部分,换句话说,它找不到C中的“大括号”应该位于哪里。例如以下代码:
int one_function( int a,int b); int another_function( int a, int b) { if ( a == 0 || b == 0 ) return -1; return one_function(a,b); }
其中return one_function(a,b)这条语句,在某些新的编译器,可能会编译成这样的指令序列:
mov esp, ebp pop ebp jmp one_funcion
而IDA是通过retn指令来识别函数的结束的,因为它不知道这里的意思,会把它当成一个函数内部 的跳转,最后就会出现sp analysis failed了。
解决办法:
对于这种情况,可以选择采用手动调整堆栈的方法将其调整平衡,或者直接使用alt+k修改sp指针,将其修改为应有的值即可
如:
之后即可反编译:
或者使用alk+k修改sp指针,如下图所示,在0x8048C6C处修改sp指针即可。
有关此修改的意义,我和同学认为是在执行完此条指令后,sp会变化多少,因此当前是-0x40,将其+0x40即可变为0,此时positive sp value的问题就解决了。