卖狼羔的羊 发表于 2014-3-6 16:48:09

关于堆栈平衡的问题

push 0
push 1
call地址
add esp,8

例如上述例子,有哪位告诉能说一下原理啊。两个参数压栈,esp=esp-8.
如果call后面不加add esp,8 注入这段代码就会报错,这是为什么啊。

跟pushad   popad有什么区别吗?

向往青莲 发表于 2014-3-6 16:48:10

本帖最后由 向往青莲 于 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


猫咪喵喵 发表于 2014-3-6 18:45:45

正确的做法是在call进去的代码里的最后用ret 8
而不是call完了再加
楼主可以用OD看看现在的编译器都是怎么做的

my_angel 发表于 2014-3-7 10:06:26

这时函数调用规则的问题,这里采用__cdecl的调用规则,有调用方平衡堆栈。。。

卖狼羔的羊 发表于 2014-3-7 12:30:04

向往青莲 发表于 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:18:45

本帖最后由 向往青莲 于 2014-3-7 13:19 编辑

卖狼羔的羊 发表于 2014-3-7 12:30 static/image/common/back.gif
前辈解释的很透彻,我还有一问题想问。就是 不是所有的注入 都需要平衡堆栈,也就是不用add esp,xxx
或者 ...
??注入要堆栈平衡?
堆栈平衡和注入半毛钱关系都木有。。。。
堆栈平衡是堆栈平衡
注入是注入
还有就是你学的少了。。。所以很多都不懂。。。学的多了。。。自然就知道了。。
这个互联网技术的很多知识是相通的

卖狼羔的羊 发表于 2014-3-8 09:14:31

向往青莲 发表于 2014-3-7 13:18 static/image/common/back.gif
??注入要堆栈平衡?
堆栈平衡和注入半毛钱关系都木有。。。。
堆栈平衡是堆栈平衡


注入完 堆栈不平衡。。功能是实现了。但是依然报错。

向往青莲 发表于 2014-3-8 11:43:41

卖狼羔的羊 发表于 2014-3-8 09:14 static/image/common/back.gif
注入完 堆栈不平衡。。功能是实现了。但是依然报错。

那你就调试一下看是哪儿的堆栈不平衡嘛。。→_→。。。或者你把代码贴上来一下。。ps:(不代表我能解答啊。。)

kaizhiyu 发表于 2014-3-9 14:37:30

这个我也说不好
页: [1]
查看完整版本: 关于堆栈平衡的问题