首页
社区
课程
招聘
[求助]IDA为什么产生 sp-analysis failed
2008-11-17 12:18 20182

[求助]IDA为什么产生 sp-analysis failed

2008-11-17 12:18
20182
用IDA静态分析,函数结尾出现 endp ; sp-analysis failed 用F5调不出伪代码,不知道是什么原因,请问有什么解决办法没有

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞0
打赏
分享
最新回复 (15)
雪    币: 2108
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
书呆彭 6 2008-11-17 13:01
2
0
endp ; sp-analysis failed

一般是程序代码有一些干扰代码,让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了。
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
antno 2008-11-17 13:12
3
0
非常感谢,
不知道有没有什么办法可以让IDA正确分析,因为函数非常长,需要伪代码来减少分析时间
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
antno 2008-11-17 13:16
4
0
函数开头调用了 __alloca_probe(堆栈分配函数)
是不是这个函数让IDA分析错误呢?
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2008-11-17 13:18
5
0
alt-k调整sp来解决
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
antno 2008-11-17 13:31
6
0
请 forgot 解释一下,如何用ALT+K 调整SP 要输入什么值呢?
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
thinkSJ 4 2008-11-17 14:13
7
0
并没有一个固定值,针对每一条指令执行完后,看看栈是否正常,如果不对,则通过ALT + K来修改.重点检查虚函数的调用, 如call [esi + n]  , 这里不一定非得是esi,以及跳转前后的栈是否一致.
另外还需要通过ALT + P 来确认下变量起始地址,清除个数与保存个数是否正常.
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
antno 2008-11-17 15:28
8
0
谢谢 牛人们的解释,现在就试一试 太感谢了
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wsyzyddd 1 2008-11-17 18:33
9
0
__alloca是声明一个不设置cookie堆栈安全检测的缓冲区,既然已经识别出来了,没有理由因为它分析错误。
雪    币: 141
活跃值: (1125)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
mavermaver 3 2008-11-17 20:11
10
0
1)用Option->General->Disassembly, 将选项Stack pointer打钩;
2)仔细观察每条call sub_xxxxxx前后的堆栈指针是否平衡;
3)有时还要看被调用的sub_xxxxxx内部的堆栈情况,主要是看入栈的参数与ret xx是否匹配;
4)注意观察jmp指令前后的堆栈是否有变化;
5)有时用Edit->Functions->Edit function...,然后点击OK刷一下函数定义。
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
antno 2008-11-18 11:49
11
0
谢谢,热心得人真多,看来我要多多进步了
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
doking 2008-11-18 18:40
12
0
呵呵,真的很有用,学习了!那出现
FFFFFFFF:function frame is wrong
又是什么原因??
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
eaglehong 2008-12-25 08:49
13
0
请教一下,具体是怎么解决的呢 谢谢!
雪    币: 238
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
suncloud 2009-3-13 11:30
14
0
good!
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pcqq 2009-3-13 16:06
15
0
看到這篇文章討論終於懂了

多謝前輩的解釋~
雪    币: 212
活跃值: (1207)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shangde 2009-3-15 03:20
16
0
public strHistGramProcess
.text:10002F59 strHistGramProcess proc near
.text:10002F59
.text:10002F59 var_78          = dword ptr -78h
.text:10002F59 var_74          = dword ptr -74h
.text:10002F59 var_70          = dword ptr -70h
.text:10002F59 var_6C          = dword ptr -6Ch
.text:10002F59 var_68          = dword ptr -68h
.text:10002F59 var_64          = dword ptr -64h
.text:10002F59 Dst             = byte ptr -60h
.text:10002F59 var_24          = dword ptr -24h
.text:10002F59 lpFileName      = dword ptr -20h
.text:10002F59 Str             = byte ptr -1Ch
.text:10002F59 var_1B          = byte ptr -1Bh
.text:10002F59 var_1A          = byte ptr -1Ah
.text:10002F59 var_19          = byte ptr -19h
.text:10002F59 var_18          = byte ptr -18h
.text:10002F59 var_14          = dword ptr -14h
.text:10002F59 var_10          = dword ptr -10h
.text:10002F59 var_C           = dword ptr -0Ch
.text:10002F59 var_4           = dword ptr -4
.text:10002F59 arg_0           = dword ptr  8
.text:10002F59 arg_4           = dword ptr  0Ch
.text:10002F59 arg_8           = dword ptr  10h
.text:10002F59 arg_C           = dword ptr  14h
.text:10002F59 arg_10          = dword ptr  18h
.text:10002F59
.text:10002F59                 mov     eax, offset loc_100073FC
.text:10002F5E                 call    _EH_prolog
.text:10002F5E
.text:10002F63                 sub     esp, 70h
.text:10002F66                 push    ebx
.text:10002F67                 push    esi
.text:10002F68                 push    edi
.text:10002F69                 mov     [ebp+var_10], esp
.text:10002F6C                 xor     edi, edi
.text:10002F6E                 mov     [ebp+var_4], edi
.text:10002F71                 mov     eax, [ebp+arg_4]
.text:10002F74                 cmp     eax, edi
.text:10002F76                 jle     loc_1000308B
.text:10002F76
.text:10002F7C                 cdq
.text:10002F7D                 push    4
.text:10002F7F                 pop     ecx
.text:10002F80                 idiv    ecx
.text:10002F82                 cmp     eax, 3Ch
.text:10002F85                 jg      loc_1000308B
.text:10002F85
.text:10002F8B                 mov     esi, [ebp+arg_8]
.text:10002F8E                 mov     eax, [esi]
.text:10002F90                 cdq
.text:10002F91                 idiv    ecx
.text:10002F93                 cmp     eax, 3Ch
.text:10002F96                 jg      loc_1000308B
.text:10002F96
.text:10002F9C                 push    3Ch             ; Size
.text:10002F9E                 push    edi             ; Val
.text:10002F9F                 lea     eax, [ebp+Dst]
.text:10002FA2                 push    eax             ; Dst
.text:10002FA3                 call    memset
.text:10002FA3
.text:10002FA8                 add     esp, 0Ch
.text:10002FAB                 mov     [ebp+var_24], edi
.text:10002FAE                 mov     [ebp+var_14], edi
.text:10002FB1                 mov     ebx, [ebp+arg_0]
.text:10002FB1
.text:10002FB4
.text:10002FB4 loc_10002FB4:                           ; CODE XREF: strHistGramProcess+9Ej
.text:10002FB4                 mov     eax, [esi]
.text:10002FB6                 shl     eax, 2
.text:10002FB9                 cmp     edi, eax
.text:10002FBB                 jge     short loc_10002FF9
.text:10002FBB
.text:10002FBD                 mov     al, [edi+ebx]
.text:10002FC0                 mov     [ebp+Str], al
.text:10002FC3                 mov     al, [edi+ebx+1]
.text:10002FC7                 mov     [ebp+var_1B], al
.text:10002FCA                 mov     al, [edi+ebx+2]
.text:10002FCE                 mov     [ebp+var_1A], al
.text:10002FD1                 mov     al, [edi+ebx+3]
.text:10002FD5                 mov     [ebp+var_19], al
.text:10002FD8                 and     [ebp+var_18], 0
.text:10002FDC                 lea     eax, [ebp+Str]
.text:10002FDF                 push    eax             ; Str
.text:10002FE0                 call    ds:atoi
.text:10002FE0
.text:10002FE6                 pop     ecx
.text:10002FE7                 mov     ecx, [ebp+var_24]
.text:10002FEA                 mov     [ebp+ecx+Dst], al
.text:10002FEE                 inc     [ebp+var_24]
.text:10002FF1                 add     edi, 4
.text:10002FF4                 mov     [ebp+var_14], edi
.text:10002FF7                 jmp     short loc_10002FB4
.text:10002FF7
.text:10002FF9 ; ---------------------------------------------------------------------------
.text:10002FF9
.text:10002FF9 loc_10002FF9:                           ; CODE XREF: strHistGramProcess+62j
.text:10002FF9                 push    [ebp+arg_C]
.text:10002FFC                 lea     ecx, [ebp+lpFileName]
.text:10002FFF                 call    CString::CString(char const *)
.text:10002FFF
.text:10003004                 mov     byte ptr [ebp+var_4], 1
.text:10003008                 push    0               ; int
.text:1000300A                 push    dword ptr [esi] ; int
.text:1000300C                 push    dword ptr [esi+18h] ; int
.text:1000300F                 push    dword ptr [esi+14h] ; int
.text:10003012                 push    dword ptr [esi+10h] ; int
.text:10003015                 push    dword ptr [esi+0Ch] ; int
.text:10003018                 push    dword ptr [esi+8] ; int
.text:1000301B                 push    dword ptr [esi+4] ; int
.text:1000301E                 push    [ebp+var_24]    ; int
.text:10003021                 lea     eax, [ebp+Dst]
.text:10003024                 push    eax             ; int
.text:10003025                 push    [ebp+lpFileName] ; lpFileName
.text:10003028                 call    sub_10002397
.text:10003028
.text:1000302D                 add     esp, 2Ch
.text:10003030                 mov     [ebp+var_64], eax
.text:10003033                 cmp     eax, 1
.text:10003036                 jnz     short loc_10003076
.text:10003036
.text:10003038                 push    [ebp+arg_10]
.text:1000303B                 push    [ebp+lpFileName]
.text:1000303E                 call    sub_100010CD
.text:1000303E
.text:10003043                 pop     ecx
.text:10003044                 pop     ecx
.text:10003045                 mov     esi, eax
.text:10003047                 mov     [ebp+var_68], esi
.text:1000304A                 test    esi, esi
.text:1000304C                 jnz     short loc_10003058
.text:1000304C
.text:1000304E                 mov     eax, 0FFFFFF36h
.text:10003053                 mov     [ebp+var_6C], eax
.text:10003056                 jmp     short loc_10003079
.text:10003056
.text:10003058 ; ---------------------------------------------------------------------------
.text:10003058
.text:10003058 loc_10003058:                           ; CODE XREF: strHistGramProcess+F3j
.text:10003058                 push    ecx
.text:10003059                 mov     ecx, esp
.text:1000305B                 mov     [ebp+var_70], esp
.text:1000305E                 lea     eax, [ebp+lpFileName]
.text:10003061                 push    eax
.text:10003062                 call    CString::CString(CString const &)
.text:10003062
.text:10003067                 mov     byte ptr [ebp+var_4], 1
.text:1000306B                 call    sub_100016DD
.text:1000306B
.text:10003070                 pop     ecx
.text:10003071                 mov     [ebp+var_74], esi
.text:10003074                 jmp     short loc_1000307B
.text:10003074
.text:10003076 ; ---------------------------------------------------------------------------
.text:10003076
.text:10003076 loc_10003076:                           ; CODE XREF: strHistGramProcess+DDj
.text:10003076                 mov     [ebp+var_78], eax
.text:10003076
.text:10003079
.text:10003079 loc_10003079:                           ; CODE XREF: strHistGramProcess+FDj
.text:10003079                 mov     esi, eax
.text:10003079
.text:1000307B
.text:1000307B loc_1000307B:                           ; CODE XREF: strHistGramProcess+11Bj
.text:1000307B                 and     byte ptr [ebp+var_4], 0
.text:1000307F                 lea     ecx, [ebp+lpFileName]
.text:10003082                 call    CString::~CString(void)
.text:10003082
.text:10003087                 mov     eax, esi
.text:10003089                 jmp     short loc_10003099
.text:10003089
.text:1000308B ; ---------------------------------------------------------------------------
.text:1000308B
.text:1000308B loc_1000308B:                           ; CODE XREF: strHistGramProcess+1Dj
.text:1000308B                                         ; strHistGramProcess+2Cj
.text:1000308B                                         ; strHistGramProcess+3Dj
.text:1000308B                 push    0FFFFFF9Ch
.text:1000308D                 pop     eax
.text:1000308E                 jmp     short loc_10003099
.text:1000308E
.text:10003090 ; ---------------------------------------------------------------------------
.text:10003090
.text:10003090 loc_10003090:                           ; DATA XREF: .rdata:stru_10008758o
.text:10003090                 mov     eax, offset loc_10003096
.text:10003095                 retn
.text:10003095
.text:10003096 ; ---------------------------------------------------------------------------
.text:10003096
.text:10003096 loc_10003096:                           ; DATA XREF: strHistGramProcess:loc_10003090o
.text:10003096                 or      eax, 0FFFFFFFFh
.text:10003096
.text:10003099
.text:10003099 loc_10003099:                           ; CODE XREF: strHistGramProcess+130j
.text:10003099                                         ; strHistGramProcess+135j
.text:10003099                 mov     ecx, [ebp+var_C]
.text:1000309C                 mov     large fs:0, ecx
.text:100030A3                 pop     edi
.text:100030A4                 pop     esi
.text:100030A5                 pop     ebx
.text:100030A6                 leave
.text:100030A7                 retn    14h
游客
登录 | 注册 方可回帖
返回