关于堆栈平衡的问题
push 0push 1
call地址
add esp,8
例如上述例子,有哪位告诉能说一下原理啊。两个参数压栈,esp=esp-8.
如果call后面不加add esp,8 注入这段代码就会报错,这是为什么啊。
跟pushad popad有什么区别吗?
本帖最后由 向往青莲 于 2014-3-7 10:43 编辑
2楼说错。。3楼说对。。。
_cdecl, stdcall fastcall 有不同的参数传递方式或者堆栈平衡方式
http://blog.csdn.net/fly2k5/article/details/544112
这里采用的是stdcall
顺便一提。。。c函数貌似大部分都是_cdecl
而win api基本上都是stdcall
win 内核api讲究效率的用的是fastcall就是用寄存器传递参数
我猜想: 函数参数固定的都是在call后面add esp,xxx来平衡堆栈。。
而win api基本上都是函数参数固定的。。。好吧。。我没遇到过想printf那样不固定参数都api
基本上就是以上了。。欢迎采纳。。(全手打)
顺便说一句。。。不加 add esp,8就会出错是因为那样堆栈就不平衡了。。就像你借钱只想着借,不想着还能行吗?
着了push 0,是压入4字节, push 1也是压入4字节,所以esp = esp -8为8字节
pushad
popad
是简化的命令 pushad = push eax
push ecx
push edx
push ebx
push esp
push ebp
push esi
push edi
popad = pop edi
pop esi
pop ebp
pop esp
pop ebx
pop edx
pop ecx
pop eax
正确的做法是在call进去的代码里的最后用ret 8
而不是call完了再加
楼主可以用OD看看现在的编译器都是怎么做的 这时函数调用规则的问题,这里采用__cdecl的调用规则,有调用方平衡堆栈。。。 向往青莲 发表于 2014-3-6 16:48 static/image/common/back.gif
2楼说错。。3楼说对。。。
_cdecl, stdcall fastcall 有不同的参数传递方式或者堆栈平衡方式
http://blog ...
前辈解释的很透彻,我还有一问题想问。就是 不是所有的注入 都需要平衡堆栈,也就是不用add esp,xxx
或者pushadpopad ,这个又是为什么呢? 本帖最后由 向往青莲 于 2014-3-7 13:19 编辑
卖狼羔的羊 发表于 2014-3-7 12:30 static/image/common/back.gif
前辈解释的很透彻,我还有一问题想问。就是 不是所有的注入 都需要平衡堆栈,也就是不用add esp,xxx
或者 ...
??注入要堆栈平衡?
堆栈平衡和注入半毛钱关系都木有。。。。
堆栈平衡是堆栈平衡
注入是注入
还有就是你学的少了。。。所以很多都不懂。。。学的多了。。。自然就知道了。。
这个互联网技术的很多知识是相通的
向往青莲 发表于 2014-3-7 13:18 static/image/common/back.gif
??注入要堆栈平衡?
堆栈平衡和注入半毛钱关系都木有。。。。
堆栈平衡是堆栈平衡
注入完 堆栈不平衡。。功能是实现了。但是依然报错。 卖狼羔的羊 发表于 2014-3-8 09:14 static/image/common/back.gif
注入完 堆栈不平衡。。功能是实现了。但是依然报错。
那你就调试一下看是哪儿的堆栈不平衡嘛。。→_→。。。或者你把代码贴上来一下。。ps:(不代表我能解答啊。。) 这个我也说不好
页:
[1]