• 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的问题就解决了。

      

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 相关阅读:
    生成前N个自然数随机置换的3个程序
    网络流媒体协议之——RTSP协议
    海思屏幕HAL代码解析
    事件路由
    hi3559v100 sdk中双系统AMP架构的初步了解
    LCD RGB 控制技术 时钟篇(下)【转】
    liteos C++支持(十七)
    liteos MMU(十八)
    APP接口做什么?
    APP如何进行通信的
  • 原文地址:https://www.cnblogs.com/echo579/p/6236277.html
Copyright © 2020-2023  润新知