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

      

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 相关阅读:
    PyScript 使用(1)
    振兴二线城市,输送一线it人员
    devops部署过慢
    Masked Language Modeling Maybe Helpful for Prompt learning Testing ?
    E 2022.4.4 2
    Kaggle踩坑记
    Go从入门到精通——示例:并发打印
    Go从入门到精通——示例:Telnet 回音服务器——TCP服务器的基本结构
    Go从入门到精通—示例:模拟远程过程调用(RPC)
    Kubernetes——centos8.0 使用kubeadm部署 k8sv1.18.20+etcdv3.3.10+flannelv0.10.0 高可用集群
  • 原文地址:https://www.cnblogs.com/echo579/p/6236277.html
Copyright © 2020-2023  润新知