*如果把堆栈分为代码堆栈和数据堆栈, 是不是就能解决"缓冲区溢出"问题?
本帖最后由 pprpg 于 2012-03-16 21:20 编辑目前是: 调用call指令时, 把call指令的下一个指令放入堆栈, 然后, ret时, 用堆栈保存的地址返回.
但如果有人通过"缓冲区溢出"的手法, 把堆栈中的地址覆盖掉, 就可以执行一些恶意代码了.
如果intel把call,ret之类的指令实现改一下:
把堆栈分为代码堆栈和数据堆栈, call,ret在代码堆栈保存和读取地址, 这样"缓冲区溢出"的方法不就失效了?
大家看看这个方法的可行性. 简单的问题复杂化了,你需要另外的指令去读你的代码栈的数据,不必要的把问题复杂化。实际上只需要在编译器中改一下,在函数调用时把栈上的返回地址另外保存一份,返回的时候检查一下两份是否一致就可以了。 oooooxxxxx 发表于 2012-03-17 04:45 static/image/common/back.gif
简单的问题复杂化了,你需要另外的指令去读你的代码栈的数据,不必要的把问题复杂化。实际上只需要在编译器中改一下,在函数调用时把栈上的返回地址另外保存一份,返回的时候检查一下两份是否一致就可以了。
还是用原来的call/ret, 对于程序和编译器都是不变的, 改变的是CPU指令的实现: 地址出入堆栈时, 改为用代码栈.
"返回地址另外保存一份", 一个是是否会给人找到这个备份地址, 另一个是比较慢.
pprpg 发表于 2012-03-17 10:04 static/image/common/back.gif
还是用原来的call/ret, 对于程序和编译器都是不变的, 改变的是CPU指令的实现: 地址出入堆栈时, 改为用代 ...
用户想故意读写栈上的返回地址怎么办?对CPU而言是没有能力判定用户对返回地址的读写是不是恶意的。 改写返回地址应该是非法的吧? 有这种需求吗?
如果确实需要读, 可以考虑增加指令. pprpg 发表于 2012-03-20 09:00 static/image/common/back.gif
改写返回地址应该是非法的吧? 有这种需求吗?
如果确实需要读, 可以考虑增加指令.
这在汇编中是再正常没有的行为了,怎么能算非法呢,
原来用sp可以直接寻址的返回地址被给成其他指令,这是显然的兼容性问题了。 为了读取, 那就把返回地址在数据堆栈上也保存一份.
改写返回地址"在汇编中是再正常没有"? 能否举个例子说明下这种需求?
pprpg 发表于 2012-03-20 14:09 static/image/common/back.gif
为了读取, 那就把返回地址在数据堆栈上也保存一份.
改写返回地址"在汇编中是再正常没有"? 能否举个例子说 ...
对兼容性来说,没禁止的就是正常的。
自己多写点汇编而不是在这里遐想自然就知道了。 oooooxxxxx 发表于 2012-03-21 00:42 static/image/common/back.gif
对兼容性来说,没禁止的就是正常的。
自己多写点汇编而不是在这里遐想自然就知道了。
可能是这样,我没写过汇编。可能汇编的写法和高级语言差别较大吧。 pprpg 发表于 2012-03-27 14:09 static/image/common/back.gif
可能是这样,我没写过汇编。可能汇编的写法和高级语言差别较大吧。
……
创新的前提是承前,想处理这些问题先要想一想,某些道理很简单为什么别人想不到,真的是他们太傻吗
我不是想指责你什么,只不过你这样连汇编都不熟悉就想修正体系结构并不是好的学习方法,所谓思而不学。