首页
社区
课程
招聘
[求助]请教函数开头的xor eax, esp指令含义
发表于: 2010-1-4 03:10 18044

[求助]请教函数开头的xor eax, esp指令含义

2010-1-4 03:10
18044
0060DB50  /   sub     esp, 4A0
0060DB56  |.  mov     eax, dword ptr [72CFD0]
0060DB5B  |.  xor     eax, esp             //经常在函数的开头看到这条指令,请教下是什么作用
0060DB5D  |.  push    ebx
0060DB5E  |.  push    ebp

xor     eax, esp 有什么作用,请大家指教

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
确保Stack平衡防溢出
2010-1-4 08:44
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
不是吧?现在很多软件有这个动作,还真的没仔细体会。
2010-1-4 09:16
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
4
因为我也是乱猜的.
2010-1-4 09:18
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
应该是用来验证堆栈是不是有溢出。
2010-1-4 10:25
0
雪    币: 230
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
0060DB56  |.  mov     eax, dword ptr [72CFD0]
前一句是上面的吧。
eax内的的地址应该还是本程序空间内,
sub则是椎栈平衡,不会是递归算法中对椎栈的核对吧?

难不成是花指令?!!!
2010-1-4 21:07
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
还是一头雾水,大家来个肯定的答案啊,好完结了它!
2010-1-5 03:17
0
雪    币: 326
活跃值: (88)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
楼上已经给出了正确的答案,结贴吧
xor     eax, esp是为了增加[72CFD0]种子的随机性,防止[72CFD0]的随机值被猜到,从而绕过检测.
2010-1-5 06:52
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
没错,是为了防止栈越界(缓冲区溢出),楼主的代码没给出eax的值放在了何处,它应放在函数栈的栈底,一旦发生栈内的缓冲区溢出,在破坏函数返回地址以前则极大的可能性(不是绝对的)先破坏该值。在函数尾部应对该值进行检查:
        mov    ecx,...
        xor     ecx, esp
        ...
        call    __security_check_cookie
如果函数开头保存在栈底的值被破坏,则__security_check_cookie则不返回,转出错处理。

72CFD0处的值为__security_cookie,对于有异常处理的函数,它的作用是做栈结构一致性检查。
2010-1-5 08:34
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
安全COOKIE
VS编译的bin默认都有
2010-1-5 09:29
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢__半道出家....
说得很详细了,懂了.....
2010-1-5 21:35
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
编译开关生产的防止缓冲区溢出的cookie
2010-1-6 13:32
0
雪    币: 234
活跃值: (202)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
应该不是为了防止堆栈溢出的,因为这样做根本起不到作用,防溢出一般是在堆栈中写入一个值,再ret之前检测这个值。

可以在贴出一些后续的代码 看看eax后续干什么用了!
2010-1-6 14:42
0
雪    币: 107
活跃值: (326)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
DEBUG模式.........
2010-1-15 12:35
0
雪    币: 169
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
正解!!
估计下面代码有一句mov [esp+498],eax这样的语句
2010-8-21 02:59
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼主可以试试在函数中自行给esp+4或者其他的

你看你这函数出不出错
2010-8-21 05:53
0
游客
登录 | 注册 方可回帖
返回
//