一、缓冲区溢出的概念
BO的概念很简单,就是你申请了一点内存,而你填入的数据超过了内容的大小,这样你填入的数据就会占用其他的内容,这种情况就是缓冲区溢出。
void copy(char* info)
{
char buf[100];
strcpy(buf, info);
}
如果info的长度大于100,就会产生buffer overflow了。
二、怎样利用BO来实施攻击?
BO听起来只是会占用其他的内存,貌似最多也只是网站的崩溃,但是不会造成安全问题。但是,BO能够引起很严重的安全问题的原因在于:攻击者可以利用缓冲区溢出带来的漏洞来实施攻击或浸入,从而使计算机能够执行攻击者填入的恶意代码,例如改变程序的返回地址(或者返回值)到攻击者想到用户访问的地址等,从而控制计算机。
三、受缓冲区影响的语言
缓冲区溢出主要影响的语言是C语言和C++,但是对于java,.net等托管的语言并不意味着不会产生这种漏洞,如果java语言编写的程序中调用了C或者C++或者windows的一些API等,都有可能会产生缓冲区溢出的漏洞。
四、实例解析缓冲区溢出为什么是安全问题?
下面有一段代码,主要功能是通过用户的姓名来判断是否是admin用户,如果用户名就是“admin”,说明其是一个admin用户,否则,认为其是一个普通用户。
bool check_login(char *name)
{
int x = 0;
char small_buffer[10];
if(strcmp(name,"admin")==0)
x = 1;
strcpy(small_buffer, name);
if(x>0){
printf("login as admin!\n");
return true;
}else{
printf("login as common user!\n");
return false;
}
}
int main(int argc, char *argv[] )
{
char *name = argv[1]; // char *name="1234567";
int res = check_login(name);
printf("%d\n",res);
return 0;
}
以上的这段代码,通过运行调试可以发现,若把char *name = argv[1];
变为char *name="admin";
,会输出”login as admin”;如果把char * name = argv[1];
变为char *name = "123456";
,会输出”login as common user”,以上这两种情况都是正确的,是因为name都没有超过缓冲区的最大值,现在测试把char * name = argv[1];
变为char *name = "12345678901234668";
(内存超过预定义的small_buffer[10]),则会输出login as admin,这个结果是错误的,而且12345678901234668这个用户可以操作管理员权限,会给安全问题带来严重影响,观察下图内存的分布就可以知道这个问题的原因:
五、缓冲区溢出可能发生在哪些情况下?
字符串输出没有限制大小长度等。
代码不正确,没有对特殊情况作出异常处理等。
Note:
缓冲区溢出一般在测试的时候并不把它归结于安全测试,一般都是在功能测试-输入数据的边界值测试中体现。
注:了解缓冲区溢出的具体分类,可参考:
http://www.51testing.com/html/62/n-7562.html