51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 7196|回复: 11
打印 上一主题 下一主题

[原创] 安全测试系列二:缓冲区溢出(Buffer Overflow/Overrun)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-11-22 10:18:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
aaa

[ 本帖最后由 cleverman 于 2009-1-18 00:54 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1
回复

使用道具 举报

该用户从未签到

推荐
发表于 2009-1-1 22:14:54 | 只看该作者
这的确是 最基本的.  测试人员,如果看的不是很明白,
我转载一个文章,给大家 看看,帮助大家理解下.

期待楼主的新作出现, 期待分享您的安全测试心得和经验.


关于缓冲区溢出,自然要从"缓冲区"说起.则,何为"缓冲区",学习过C语言的人应该知道,当程序即将运行时,会检查该程序将会使用到的变量,并且为该变量在内存中"划"出(或者用"登记"比较合适)一段来,用于存贮该变量的数据.而被分出的内存区域大小则和程序代码的变量长度一样.例如,定义某变量为8个字符,则该被分配内存大小也为8.
    什么是变量,且听下面的例子(或许不是很准确):
例如,你要计算一个长方形的面积,可以根据数学公式:
长*宽=面积,
得出.
倘若一个长方形长为20,宽为10,用程序表示出来或许应该如下下面的程序我想用任何编译器都编译不出,用脑袋或许可以)
行1    l=20
行2    h=10
行3    s=l*h
现在让我们解读一下该"程序"
其中,我们用"l"表示"长方形的长",并且赋值为"20",行1;
其中,用"h"代表"长方形的宽",赋值为"10",行2;
其中,用"s"表示"长方形的面积",值为"l*h",白话则是用"l"乘"h"得出面积,行3,这也恰恰应用到了数学的公式.
    问题也就随之出现,上面的程序显然是有很大的弊病的.因为--它仅仅可以计算一个长方形的面积,世界上那么多长方形,要如何计算?!难道要为每个长方形都写一个程序么?
    然而事情看样子总是有转机的,变量也就随之出现了,当有了变量,我们就可以输入(通过你的键盘)数据给程序,程序接受后,则会计算出相应的长方形了.
程序或许可以如下:
行1  +------输入"长"
行2  |      输入"宽"---------------------+
行3  +------长的变量                     |
行4         宽的变量---------------------+  
行5  搜集到了足够的信息,执行s=l*h
    事情就这样被解决了?不,经过上面的温习,我们初步了解了一些程序的知识.现在进入缓冲区溢出这个概念.
    还要提起变量,我们在本问第二自然段提过:
"当程序即将运行时,会检查该程序将会使用到的变量,并且为该变量在内存中"划"出(或者用"登记"比较合适)一段来,用于存贮该变量的数据.而被分出的内存区域大小则和程序代码的变量长度一样.例如,定义某变量为8个字符,则该被分配内存大小也为8."
    让我们看这一段:
"被分出的内存区域大小则和程序代码的变量长度一样.例如,定义某变量为8个字符,则该被分配内存大小也为8."
    问题出现了,为什么要给变量定义一个长度呢?我是这样理解的,因为它需要在内存中分配出空间给该变量提供数据存贮空间,倘若,没有事先定义好该变量的数据长度(或者谨慎的说"最长度"),则,我们的计算机到底要为它分配多少空间呢?1K?1M?1G?呵呵,显然为其定义一个长度是有必要的!
    何为缓冲区溢出?有何危害?
    震荡波你应该熟悉,它就是利用了ms04-011漏洞,是一个缓冲区溢出的利用.至于危害,你可以查阅以前的帖子或者有幸体会吧?
    下面的内容或许很笼统,但确实是我所理解的.还是举个例子:
试图我们要编写一个如下的程序,该程序运行的时候会自动读取同目录下的1.txt中的内容,并且写入到变量A中.代码如下(注:"//"后为注释)
行1   变量A[10]     //设置了一个变量A,长度10
行2   读取本程序同目录下的1.txt中的内容
行3   将读取的内容写入到变量A中
-=程序完=-
     看样子是一个很符合逻辑的程序,但是问题恰好出现了:
如果该1.txt内容如下:
123456789
则,不会出现问题
倘若,1.txt内容如下:
123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789
这样会如何呢?来分析一下,
这个时候程序会执行到第二行,当执行到第三行的时候就会产生溢出了!问题出在程序的"行1",因为它定义的变量长度为10,而1.txt中的内容远远大于了10,换句话讲,该段内存被撑着了.
    被撑着的内存会溢出,好比,一杯水,满了,还继续往里面倒,必然会影响到桌子的卫生(我想这样的比喻更能诠释"溢出"二字)
    本文的读者,你看懂了么?(
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

2#
发表于 2008-11-22 11:24:19 | 只看该作者
大概意思能明白,a naive question:
黑客没有source code,怎么分析出哪段程序里有BO呢?
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2008-11-22 12:32:48 | 只看该作者
还记得一些大学时候学的汇编,随便说说哈,我这里的办法前提是有binary在手,要是分布式的,还没想到怎么搞。

1.怎样得到放return address的内存地址?
            反编译得到汇编代码,在主程序段里面,调用你那那个方法的后面一行地址应该就就是你这个方法的return address。
2.怎样决定用什么地址来覆盖return address?
            就拿调用那个方法的地址,因为先压进去的是input吗,这样前面直接输入的就变成执行了 。
3.什么样的代码应该放入缓冲区,这段代码做什么用,这段代码怎么编写?
             思考中。。。   貌似有很多激动人心的事情可以做的。。。
4.有什么措施可以防止缓冲区溢出?也就是说即使发生缓冲区溢出,黑客也不能或者难以利用?
             尽量用你的使用语言提供的安全的方法,否则的话自己做做输入越界检查。
5.如果对方系统使用这些措施,有什么相应的办法去绕过?
             不知道。。。大家继续
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2008-11-22 23:05:03 | 只看该作者
原帖由 vldb 于 2008-11-22 11:24 发表
大概意思能明白,a naive question:
黑客没有source code,怎么分析出哪段程序里有BO呢?


你这个问题问得很好,这也就是为什么我说白盒测试比黑盒简单的缘故了。黑客或者黑盒测试人员由于没有源代码,就使得白盒测试人员一眼就看出来的bug要经过更多更复杂,繁琐的过程才能发现,很多甚至可能还没发现。具体怎么测试,我会在随后的文章进行讲解。
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2008-11-23 12:06:37 | 只看该作者

penetrate 测试三卷本上就是针对这个。

其实这个内容拿到测试论坛来说,我觉得并不合适。因为对大部分测试人员来说:
用windbg等工具进行调试的机会很少,于是对汇编接触并不多;
接触OS底层的C/C++代码,能在工作中用到的也不会太多。

感觉这内容,对开发来说内容太浅了,对测试来说由于接触不多,如坠入云雾之中。

如果真是有心教会大家安全测试,不妨从最基本的内容开始,也许等到做完,可以出一本书,看雪的破解好像就是这么来着。

[ 本帖最后由 shanxi 于 2008-11-23 12:08 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

6#
 楼主| 发表于 2008-11-23 14:53:20 | 只看该作者
我觉得这个已经是最基本的了。如果这个都没弄明白,怎么做安全测试呢?你出去面试也会露怯吧?就像我以前那样。
我现在写的文章都是安全测试的基本知识与技术,目前阶段都没有展开,深入来谈。
而且,对开发来说太简单了,也得看是什么样的开发吧?我以前也是做开发的,我就不觉得这些简单,我以前也不明白。
我本来目的就不是要教会大家安全测试,这些东西还是得主要靠自己学习,我只是给大家一个启发罢了。
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2008-12-5 23:21:48 | 只看该作者
期待下,我的基础还是太弱了,看一位前辈的光速入门缓冲区溢出,就十多页的文章看了N遍看不懂,唉,所以决定从头开始学汇编
也期待LZ继续深入下去
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2009-1-2 16:28:19 | 只看该作者

对Web有兴趣的直接看这个系列

回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2012-12-4 18:54:53 | 只看该作者
{:4_83:}
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2014-10-11 17:22:14 | 只看该作者
chen13 发表于 2009-1-1 22:14
这的确是 最基本的.  测试人员,如果看的不是很明白,
我转载一个文章,给大家 看看,帮助大家理解下.

这个比较浅显易懂 。。。。。如果不看代码的话 怎么确定产生了溢出?
回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 2014-11-19 13:32:18 | 只看该作者
谢谢分享,本人是菜鸟,想学点WEB安全测试方面的知识。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-25 15:38 , Processed in 0.075247 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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