能力值:
(RANK:410 )
|
-
-
2 楼
是你自己的用法有问题,你push x了一个x值,没有相应的pop出栈,倒致堆栈错乱了,当然会出错了,你如果真要反回x的值,用eax来返回。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
用例的目的是为了说明如何简便而又可靠地保证在堆栈不平衡的情况下,被保护的若干个寄存器在子程序返回后其值仍同子程序进入前一样,不牵涉到子程序的返回值。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
这并不是USERS的安全问题,是你自己的用法错误,你不按标准用,就不要用USES,应该自己写代码处理
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
最初由 casn 发布 强烈建议:编译器(包括但不限于汇编编译器)开发商要对上述问题有个客观的认识,采取可靠措施积极消除安全隐患。
提高认识的应该是你自己。你自己不遵守语言的语法规则,能怪编译器?编译器的智能程度不可能那么高。
|
能力值:
( LV8,RANK:130 )
|
-
-
6 楼
其实我明白楼主的意思,他说的是MASM在建立STACK FRAME的顺序上有点问题,我们知道一般的编译/汇编器是按照以下顺序建立STACK FRAME的:
push ebx
push esi
push edi
push ebp
mov ebp,esp
sub esp,xxx
而MASM则是:
push ebp
mov ebp,esp
sub esp,xxx
push ebx
push esi
push edi
这样就完全抹消掉使用ebp作为LOCAL基指针的好处了,在出口处MASM首先就要pop原来保护的寄存器,如果此时堆栈没有平衡的话,pop出来的内容就会不对。
而其它的编译/汇编器会首先恢复esp,然后在原来esp的基础上恢复其它寄存器,这样即使堆栈不平衡也不会造成问题
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
坛友drwch的理解完全正确。
理解万岁!
|
能力值:
( LV12,RANK:210 )
|
-
-
8 楼
反汇编一些程序就可以发现,只要是微软的编译器编译的程序,都是先构造栈帧,然后保存ebx,esi,edi等寄存器,而不是先保存寄存器。不仅仅是MASM的问题
例如,以下是kernel32.dll中的一段,可以发现它也是先构造堆栈然后才保存三个重要寄存器的
Exported fn(): LCMapStringA - Ord:023Bh
:77E2569E 55 push ebp
:77E2569F 8BEC mov ebp, esp
:77E256A1 81EC08020000 sub esp, 00000208
:77E256A7 53 push ebx
:77E256A8 56 push esi
:77E256A9 57 push edi
:77E256AA 8B7D0C mov edi, dword ptr [ebp+0C]
:77E256AD 57 push edi
:77E256AE FF7508 push [ebp+08]
:77E256B1 E8820BFFFF call 77E16238
:77E256B6 33DB xor ebx, ebx
:77E256B8 3BC3 cmp eax, ebx
:77E256BA 8945F8 mov dword ptr [ebp-08], eax
:77E256BD 0F84C3000000 je 77E25786
:77E256C3 395D1C cmp dword ptr [ebp+1C], ebx
:77E256C6 0F8CBA000000 jl 77E25786
:77E256CC 7409 je 77E256D7
:77E256CE 395D18 cmp dword ptr [ebp+18], ebx
:77E256D1 0F84AF000000 je 77E25786
|
能力值:
( LV6,RANK:90 )
|
-
-
9 楼
最初由 drwch 发布 其实我明白楼主的意思,他说的是MASM在建立STACK FRAME的顺序上有点问题,我们知道一般的编译/汇编器是按照以下顺序建立STACK FRAME的:
push ebx push esi push edi ........
我好像还没有见过这种顺序,这样的话,传递给函数的参数就不能用了~
|
能力值:
( LV8,RANK:130 )
|
-
-
10 楼
只是指针变动一下而已,为何不能用?楼上可以试试GOASM,看看它与MASM在构造STACK FRAME上有什么区别
|
能力值:
( LV12,RANK:210 )
|
-
-
11 楼
用MASM也可以指定是先保存寄存器或者是先构造栈帧
使用OPTION PROLOGUE和OPTION EPILOGUE伪指令就可以做到
|
能力值:
( LV13,RANK:1250 )
|
-
-
12 楼
push后跟ret?是在构造变形jmp吗?
另外好象MASM里凡是在子程序里用到ret指令,编译器就会马上在前面加上leave,这样想用push/ret来构造变形跳转都无法做到,因为ret指令一用就变成leave然后从子程序返回了!
|
能力值:
( LV12,RANK:210 )
|
-
-
13 楼
最初由 冲天剑 发布
另外好象MASM里凡是在子程序里用到ret指令,编译器就会马上在前面加上leave,这样想用push/ret来构造变形跳转都无法做到,因为ret指令一用就变成leave然后从子程序返回了!
可以做到的,用OPTION EPILOGUE:NONE就可以
|
|
|