zoukankan      html  css  js  c++  java
  • IDA反编译失败:positive sp value has been found

    前言:

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

      

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 相关阅读:
    JAXB基本使用
    Spring MVC手札
    Oracle创建表空间和表
    oracle删除表,让整个表从数据库中彻底消失
    oracle创建用户操作
    查看运行时某个java对象占用JVM大小及通过idea查看java的内存占用情况
    如何查看java进程
    win10下查看进程,杀死进程
    js计算两个时间相差天数
    windows 端口号占用和解决方法
  • 原文地址:https://www.cnblogs.com/echo579/p/6236277.html
Copyright © 2011-2022 走看看