首页
社区
课程
招聘
未解决 为什么mov esp, ebp失败呢
2023-7-3 21:20 6082

未解决 为什么mov esp, ebp失败呢

2023-7-3 21:20
6082

如题所示,为什么esp与ebp的mov指令是无效的呢?是受什么标识寄存器的影响吗?查看mov esp,ebp对应的机器码是E8E5。希望有大神看到此贴,不吝赐教一下,万分感谢。

完整的反汇编代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
int g_pI, g_pJ, g_sum;
 
void __declspec(naked) XXX_Part()
{
    __asm {
        /*0x00401080*/    push ebp
        /*0x00401081*/    mov ebp, esp
        /*0x00401083*/    sub esp, 0xC
 
#if 1
        /*0x00401086*/    mov g_sum, 0x0
        /*0x0040108D*/    mov g_pI, 0x0
        /*0x00401094*/    jmp LABEL_0x0040109F
        LABEL_0x00401096:
        /*0x00401096*/    mov eax, g_pI
        /*0x00401099*/    add eax, 0x1
        /*0x0040109C*/    mov g_pI, eax
        LABEL_0x0040109F:
        /*0x0040109F*/    cmp g_pI, 0x3
        /*0x004010A3*/    jge LABEL_0x004010CD
        /*0x004010A5*/    mov g_pJ, 0x0
        /*0x004010AC*/    jmp LABEL_0x004010B7
        LABEL_0x004010AE:
        /*0x004010AE*/    mov ecx, g_pJ
        /*0x004010B1*/    add ecx, 0x1
        /*0x004010B4*/    mov g_pJ, ecx
        LABEL_0x004010B7:
        /*0x004010B7*/    cmp g_pJ, 0x3
        /*0x004010BB*/    jge LABEL_0x004010CB
        /*0x004010BD*/    mov edx, g_pI
        /*0x004010C0*/    shl edx, 0xA
        /*0x004010C3*/    add edx, g_pJ
        /*0x004010C6*/    mov g_sum, edx
        /*0x004010C9*/    jmp LABEL_0x004010AE; GOTO BACK
        LABEL_0x004010CB:
        /*0x004010CB*/    jmp LABEL_0x00401096; GOTO BACK
        LABEL_0x004010CD:
        /*0x004010CD*/    mov eax, g_sum
#endif
        mov esp, ebp
        pop ebp
 
        ret
    }
}

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

最后于 2023-7-3 22:13 被_THINCT编辑 ,原因:
收藏
免费 1
打赏
分享
最新回复 (9)
雪    币: 3737
活跃值: (8080)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
_THINCT 2023-7-3 22:02
2
0

通过观察,发现只要编译了38行的 mov eax, g_sum就会引起该错误,通过上下寄存器比较发现,执行 mov esp,ebp之后,ecx莫名其妙的被修改成原来esp的值。并且修改该指令为:
        mov edx, g_sum
        /*0x004010CD*/    mov eax, edx
发现问题就解决了。

其中33行到结束的硬编码:
A1 C8 84 A8 0F 8B E5 5D C3
也没有发现什么玄机,求大佬指点了。

最后于 2023-7-3 23:13 被_THINCT编辑 ,原因:
雪    币: 6843
活跃值: (3465)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
htpidk 2023-7-3 22:07
3
0
测试正常,你换个IDE试试
雪    币: 6843
活跃值: (3465)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
htpidk 2023-7-3 22:10
4
0

雪    币: 3863
活跃值: (3883)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mxixihaha 2023-7-3 22:15
5
0
清理项目  重新编译生成
雪    币: 3737
活跃值: (8080)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
_THINCT 2023-7-3 22:32
6
0

直接下断点在0x505A27A6就可以了,主要可能是断点机制影响了寄存器,所以才有ecx值被修改的现象。

最后于 2023-7-3 23:14 被_THINCT编辑 ,原因:
雪    币: 3737
活跃值: (8080)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
_THINCT 2023-7-3 22:36
7
0
htpidk
感谢大佬的回复。
雪    币: 1790
活跃值: (3146)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
拍拖 2 2023-7-4 08:44
8
0
_THINCT 直接下断点在0x505A27A6就可以了,主要可能是断点机制影响了寄存器,所以才有ecx值被修改的现象。
按道理0x505A27A4这里的断点应该不会影响到寄存器值才对。 没看到汇编代码中有访问内存地址或代码段地址的地方? 如果是调试断点影响了寄存器那就是VC调试的BUG?
雪    币: 3737
活跃值: (8080)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
_THINCT 2023-7-4 10:40
9
0
拍拖 按道理0x505A27A4这里的断点应该不会影响到寄存器值才对。 没看到汇编代码中有访问内存地址或代码段地址的地方? 如果是调试断点影响了寄存器那就是VC调试的BUG?
就是因为编译了/*0x004010CD*/    mov eax, g_sum这一句造成的影响,注释该句就正常了。这个g_sum是访问了内存的,大佬,访问内存地址或者代码地址可能会mov esp, ebp指令造成影响吗?这是哪方面的问题,我要补补课了 
雪    币: 1065
活跃值: (3866)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
逆向爱好者 2023-7-8 10:50
10
0
rsp保存的是堆栈地址,不能随便改吧,call,,ret,push,pop这几个就能改
游客
登录 | 注册 方可回帖
返回