首页
社区
课程
招聘
[旧帖] [求助][讨论]小弟请教个堆栈平衡的问题! 0.00雪花
发表于: 2008-7-13 03:52 3893

[旧帖] [求助][讨论]小弟请教个堆栈平衡的问题! 0.00雪花

2008-7-13 03:52
3893
堆栈平衡的原理是不是只适用于用堆栈传递参数时?目的就是为了销毁传递进去的参数?

如果我不平衡堆栈的话
下次的错误会在哪里报出呢? 会是什么错误呢?
网上搜索了下 只知道会崩溃. 为什么会崩溃?
我在下个函数中再push进去参数的依然是放在原先没有销毁的数据的上面,
我ret的时候跟栈顶的数据并没有关系呀?
难道是在栈段中超过64KB溢出而崩溃???? 很疑惑!!!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 201
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
堆栈平衡是在函数调用的时候使用的。当你调用了一个函数,上下文发生了改变,必然要 保存原来的上下文,以备函数返回时使用。
2008-7-13 08:47
0
雪    币: 252
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
用命令 ret X 返回
X是你用堆栈传递的参数的总大小(字节),并且X一定是偶数
2008-7-13 11:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我觉得可能是这样,不知对不对。
报错的地方不一定,错误也不一定。
随便举个例子:
foo1()
{
        int a;
        foo2();
        a = 0;
}
如果foo2()在返回后没有平衡堆栈,那么在a=0;这句,通过ebp访问变量a时,就会因为多余的在堆栈中的foo2()的变量而造成错误。
2008-7-13 11:22
0
雪    币: 239
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
一般调用函数时的做法都是先将参数压进堆栈,后再call,栈平衡得是要恢复栈顶位置,要么是在函数内部进行,另外一种是在调用函数后进行
例:
push  XXX   //假设操作数位32位,即四个字节
push XXX
push XXX

call  function1

那么函数内平衡,一般在function1函数内最后返回时一般都这么写:ret   0CH,为什么是0cH呢,因为我们要让栈顶指到前12个字节之前,因为你的参数占用了12个字节,ESP=ESP-12

函数外平衡

push  XXX   //假设操作数位32位,即四个字节
push XXX
push XXX

call  function1
sub  ESP,0CH

假如是你自己写的函数,不平衡的话,你想想,是不是会造成栈浪费,最后栈溢出,也就是栈的大小已经超出可寻址的范围,最后程序必将崩溃
这是我的理解,希望能帮到你啊
2008-7-13 12:00
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
恩 谢谢楼上的几位兄弟! 我能理解堆栈平衡的原理, 就是不知道为什么呢! 可能要等以后继续深入学习了才知道!!! 知其然不知其所以然啊!!!!  ! 严重感谢楼上!!
2008-7-14 04:21
0
游客
登录 | 注册 方可回帖
返回
//