IDA反编译失败:positive sp value has been found

时间:2024-03-12 13:35:12

 

前言:

  很不争气的,在做第一天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的问题就解决了。