免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: pprpg
打印 上一主题 下一主题

*如果把堆栈分为代码堆栈和数据堆栈, 是不是就能解决"缓冲区溢出"问题? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-04-08 12:44 |只看该作者
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,大部分的缓冲区溢出的攻击都是基于摧毁栈的方式,不代表增加多一个栈就能够避免。,从根源上说,冯诺依曼计算机体系结构的计算机都会有这么一个问题。添加多一个栈只会增加成本,而且也没有从根源上解决问题,只要程序不对数据做检查,数据足够大的情况下,还是可以把合法数据给覆盖了,这同样算是缓冲区溢出。就算增加栈了,别有用心的黑客只要获得那栈指针,要改也不是不可以的,就算增加一个权限,只有特定的权限才可以写入,那么CPU也没法保证写入的数据是正确的。缓冲区溢出是程序上面的缺陷。CPU只会根据它自己的状态寄存器里面的设置来进行数据读写和运算,当然要是想给CPU增加一个“智能”的功能,实现软件里面的检测功能,不说不行(成本有多大无法估计),效率就是一个关键问题,毕竟本来一个写入信号就完成的事情了,现在那信号还得经过一个检测,另外功耗等诸多问题都会出现。毕竟CPU是处理器不是软件,没有那么“智能”进行那么多判断,只会对信号进行处理。

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
22 [报告]
发表于 2012-04-08 13:39 |只看该作者
jianus 发表于 2012-04-08 12:44
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,大部分的缓冲区溢出的攻击都是基于摧毁栈的方式,不代表增加多一个栈就能够避免。,从根源上说,冯诺依曼计算机体系结构的计算机都会有这么一个问题。添加多一个栈只会增加成本,而且也没有从根源上解决问题,只要程序不对数据做检查,数据足够大的情况下,还是可以把合法数据给覆盖了,这同样算是缓冲区溢出。就算增加栈了,别有用心的黑客只要获得那栈指针,要改也不是不可以的,就算增加一个权限,只有特定的权限才可以写入,那么CPU也没法保证写入的数据是正确的。缓冲区溢出是程序上面的缺陷。CPU只会根据它自己的状态寄存器里面的设置来进行数据读写和运算,当然要是想给CPU增加一个“智能”的功能,实现软件里面的检测功能,不说不行(成本有多大无法估计),效率就是一个关键问题,毕竟本来一个写入信号就完成的事情了,现在那信号还得经过一个检测,另外功耗等诸多问题都会出现。毕竟CPU是处理器不是软件,没有那么“智能”进行那么多判断,只会对信号进行处理。


缓冲区溢出是单方向的吧? 只要把新的代码堆栈放在缓冲区溢出的反方向是不是就可以了?
比如:
缓冲区溢出是由局部变量开始, 向地址增加的方向溢出. 那么只要把代码堆栈放在比数据堆栈地址更小的地址里.


黑客获得代码堆栈指针还是有可能的, 但这个方案主要是看看能否避免通过缓冲区溢出的方式修改它.

我同意CPU不能实现的太复杂, 但我觉得这种方案主要区别在于通过代码堆栈保存IP指针, 应该代价不会太大.

论坛徽章:
0
23 [报告]
发表于 2012-04-08 14:24 |只看该作者
pprpg 发表于 2012-04-08 13:39
缓冲区溢出是单方向的吧? 只要把新的代码堆栈放在缓冲区溢出的反方向是不是就可以了?
比如:
缓冲区溢 ...

单方向的?我看不出来单方向的,后面的踩不到,那么前面的可以踩,只需要一个踩到就可以了,或者只需稍微偏移一下地址就可以改了。否则这个栈只能放到边边上去了,那么岂不是直接告诉别人那个栈在哪里,过去改了就行了。另外栈如果要添加的话,对于linux而言,只能够添加到更小的地址里面去了,因为现在栈就是摆在离内核最近的低于3G的内存空间里面去了。添加到低地址的内存那边?那就更糟了,那边除了程序的数据段和代码段,就是malloc的空间,那么随便一个写越界,什么都玩完了。反正这栈不能放到代码段里面,这里面的数据就别指望能够写的,那么放到数据段?那就更好改了。

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
24 [报告]
发表于 2012-04-08 16:08 |只看该作者
jianus 发表于 2012-04-08 14:24
单方向的?我看不出来单方向的,后面的踩不到,那么前面的可以踩,只需要一个踩到就可以了,或者只需稍微偏移一下地址就可以改了。否则这个栈只能放到边边上去了,那么岂不是直接告诉别人那个栈在哪里,过去改了就行了。另外栈如果要添加的话,对于linux而言,只能够添加到更小的地址里面去了,因为现在栈就是摆在离内核最近的低于3G的内存空间里面去了。添加到低地址的内存那边?那就更糟了,那边除了程序的数据段和代码段,就是malloc的空间,那么随便一个写越界,什么都玩完了。反正这栈不能放到代码段里面,这里面的数据就别指望能够写的,那么放到数据段?那就更好改了。


关于单方向, 举个例子:

现在的堆栈:
高位地址
...
返回地址
局部变量char *s[10]
局部变量int a

...
低位地址

向s copy 20个字节, 使s溢出, 覆盖"返回地址". 但a是不会被覆盖的.
攻击者可以任意构造数据, 再利用了原有代码没有检查长度的漏洞. 但不是能够直接操作指针.

新的内存分布:
把原来堆栈往高位挪一些, 腾出写地方放新的代码栈就可以了.

高位地址
...


数据栈
代码栈
...
低位地址

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
25 [报告]
发表于 2012-04-08 17:07 |只看该作者
pprpg 发表于 2012-03-16 21:12
目前是: 调用call指令时, 把call指令的下一个指令放入堆栈, 然后, ret时, 用堆栈保存的地址返回.
但如果有 ...



你说的是有道理的, 不过稍微复杂了点。 现在AMD/Intel的做法是, 在页表中引入NX位,只要enable了,那么正常情况下, shellcode是位于stack的, 这是可以被页表指定为『不可执行』的,因此即使覆盖了返回地址, shellcode还是无法执行。 尝试执行stack中的shellcode,会引起CPU异常。



FYI:

en.wikipedia.org/wiki/NX_bit

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
26 [报告]
发表于 2012-04-08 19:33 |只看该作者
帅绝人寰 发表于 2012-04-08 17:07
你说的是有道理的, 不过稍微复杂了点。 现在AMD/Intel的做法是, 在页表中引入NX位,只要enable了, ...


这种方法也是有漏洞的, 可以参考下面的文章
http://bbs.pediy.com/showthread.php?t=123572
搜索:"ret2lib"


所以我想换个思路看看, 能不能有效.

论坛徽章:
0
27 [报告]
发表于 2012-04-09 02:57 |只看该作者
快活幸福、悲伤苦楚,无论好坏都证实着我们存在的意义,让我们学会爱护。

我在顶贴~!~










signature..................................
仙府之缘

论坛徽章:
0
28 [报告]
发表于 2012-04-15 11:08 |只看该作者
pprpg 发表于 2012-04-08 16:08
关于单方向, 举个例子:

现在的堆栈:


这就是你说的单向,这与溢出无关,a下面那个大点,照样能覆盖。
另外按照你这个内存分布来看,你准备预留多大空间给代码栈,空间浪费不?别和我说它占空间多与少,你怎么知道一个程序要压栈多少?如果我在数据栈拼命地压数据,能够吃到代码栈不?

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
29 [报告]
发表于 2012-04-15 12:57 |只看该作者
jianus 发表于 2012-04-15 11:08
这就是你说的单向,这与溢出无关,a下面那个大点,照样能覆盖。
另外按照你这个内存分布来看,你准备预留多大空间给代码栈,空间浪费不?别和我说它占空间多与少,你怎么知道一个程序要压栈多少?如果我在数据栈拼命地压数据,能够吃到代码栈不?


a怎么覆盖?

就算是现在, 栈的空间也不是无限的, 会报超出错误.

论坛徽章:
0
30 [报告]
发表于 2012-04-15 15:45 |只看该作者
pprpg 发表于 2012-04-15 12:57
a怎么覆盖?

就算是现在, 栈的空间也不是无限的, 会报超出错误.


我在申请a之后,申请一个b,弄个大点的值复制过去给b,a不就没了嘛~
我知道现在的栈空间是有限的,我只是问你准备设多大?怎么避免空间不被浪费?
另外你不是在讨论缓冲区溢出吗?我只是想问我拼命地压数据,能不能把你前面的栈给覆盖了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP