鱼C论坛

 找回密码
 立即注册
查看: 2426|回复: 8

关于堆栈平衡的问题

[复制链接]
发表于 2014-3-6 16:48:09 | 显示全部楼层 |阅读模式
10鱼币
push 0
push 1
call  地址
add esp,8

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

跟pushad   popad  有什么区别吗?

最佳答案

查看完整内容

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基本上都是函数参数固定的。。。好吧。。 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-6 18:45:45 | 显示全部楼层
正确的做法是在call进去的代码里的最后用ret 8
而不是call完了再加
楼主可以用OD看看现在的编译器都是怎么做的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-7 10:06:26 | 显示全部楼层
这时函数调用规则的问题,这里采用__cdecl的调用规则,有调用方平衡堆栈。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-7 12:30:04 | 显示全部楼层

前辈解释的很透彻,我还有一问题想问。就是 不是所有的注入 都需要平衡堆栈,也就是不用add esp,xxx
或者pushad  popad ,这个又是为什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-7 13:18:45 | 显示全部楼层
本帖最后由 向往青莲 于 2014-3-7 13:19 编辑
卖狼羔的羊 发表于 2014-3-7 12:30
前辈解释的很透彻,我还有一问题想问。就是 不是所有的注入 都需要平衡堆栈,也就是不用add esp,xxx
或者 ...

??注入要堆栈平衡?
堆栈平衡和注入半毛钱关系都木有。。。。
堆栈平衡是堆栈平衡
注入是注入
还有就是你学的少了。。。所以很多都不懂。。。学的多了。。。自然就知道了。。
这个互联网技术的很多知识是相通的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-8 09:14:31 | 显示全部楼层
向往青莲 发表于 2014-3-7 13:18
??注入要堆栈平衡?
堆栈平衡和注入半毛钱关系都木有。。。。
堆栈平衡是堆栈平衡

注入完 堆栈不平衡。。功能是实现了。但是依然报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-8 11:43:41 | 显示全部楼层
卖狼羔的羊 发表于 2014-3-8 09:14
注入完 堆栈不平衡。。功能是实现了。但是依然报错。

那你就调试一下看是哪儿的堆栈不平衡嘛。。→_→。。。或者你把代码贴上来一下。。ps:(不代表我能解答啊。。)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-9 14:37:30 | 显示全部楼层
这个我也说不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 23:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表