LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 669|回复: 5

偶然想到的堆栈问题

[复制链接]
发表于 2004-11-11 11:51:47 | 显示全部楼层 |阅读模式
在大多数机器体系结构下,堆栈都是向下生长的,也就是说,如果把一个对象压入堆栈,栈指针的值会减小。这样,我们利用缓冲区溢出可以重写堆栈上的返回地址,执行我们自己希望执行的代码。

但仍然存在一些机器,它们的堆栈上向上生长的,这样可能无法重写返回地址。在这种机器上,应该是不能利用缓冲区溢出改写返回地址了。是这样吗?
发表于 2004-11-11 12:01:53 | 显示全部楼层
这样 就没有 “缓冲溢出“的概念了
发表于 2004-11-11 14:51:12 | 显示全部楼层
这样以来要想通过传递参数来改写返回地址就难了,可是一定有别的方法可以用呀.
比如你自己写个程序要根据局部变量地址找到返回地址然后修改之,这和堆栈的增长方向关系不大吧,只不过原来用加法,现在用减法.
发表于 2004-11-11 15:52:31 | 显示全部楼层
还有些机器调用函数时根本不把返回地址写到栈上,。。。因为有相关的硬件支持,
这是一个体系结构的问题,我看还是先把x86上的代码写好再说吧,
发表于 2004-11-12 11:44:48 | 显示全部楼层
最初由 nuclearweapon 发表
这样 就没有 “缓冲溢出“的概念了

缓冲溢出的问题仍然存在,只是没有办法覆盖函数的返回地址了。
发表于 2004-11-12 18:16:09 | 显示全部楼层
TO:楼上
   我的加引号的意思是:按照现在的缓冲区溢出思路再去做已经没有实际意义了。(主要是栈)即使理论上还可以,但是没有什么实际意义了,出现的几率也很小。
   我解释一下:
第一,buffer overflow 的意思是一个函数的现场由于某种原因被破坏。例如:由于c编译器和现在栈结构的原因。在一个函数A调用的另外一个函数B的时候,A的现场可能由于B的一个局部数组越界而导致破坏。
第二,所谓的修改返回地址,一般(有实际目的)都是给系统调用大量的数据,发生的。要是堆栈上向上生长的,这样你是修改不了的。

你可能说,“我可以在我的函数里用减法来修改栈里的数据”,哪有什么用!!!你修改以后调用你自己的函数?!搞乱自己的现场?!没必要吧。调用不让用的内核函数?!不可能的。
所以说,也就没有意义了。

话说过来,这些和编译器体,系结构有很大关系。这只是简简单单的推理,其实会很复杂。
所以说,也就没有意义了。

因为以前不是太关注!可能还有其他方法!? 仔细说说可行性。楼上!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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