win7环境下的栈溢出与实战-创新互联

栈溢出原理与实践

成都创新互联公司服务项目包括海林网站建设、海林网站制作、海林网页制作以及海林网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,海林网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到海林省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

       本文已发至《***防线》

在我们的生活中,存在的许许多多的漏洞,下面像大家介绍的就是平时比较常见的栈溢出漏洞的实践过程。

下面,我们用一个非常简单的例子来让大家对栈溢出漏洞有个直观的认识。

这是一个简单的密码验证程序,但因为代码不严密,导致了栈溢出漏洞的产生。

#include

#include

#define PASSWORD "1234567"

int verify_password (char *password)

{

        intauthenticated;

        charbuffer[8];//定义一个大小为8字节的数组,控制没溢出的字符串长度;(超出这个长度就发生溢出)

        authenticated=strcmp(password,PASSWORD);

        strcpy(buffer,password);//这个语句就直接导致了溢出的发生

        returnauthenticated;

}

main()

{

        intvalid_flag=0;

        charpassword[1024];

        while(1)

        {

                  printf("请输入密码:");

                  scanf("%s",password);

                  valid_flag=verify_password(password);

                  if(valid_flag)

                  {

                           printf("密码错误!\n\n");

                  }

                  else

                  {

                           printf("恭喜,你通过了验证!\n");

                           break;

                  }

        }

}

具体的运行情况如下:

win7环境下的栈溢出与实战图1

win7环境下的栈溢出与实战

但是,如果我们输入这样的密码,它也能通过

图2

那么,出现这种情况的原因是什么呢?

win7环境下的栈溢出与实战图3

这是程序运行时栈的情况。

学过C语言的人应该知道,我们一个字符串的结尾是以字符串截断符null作为字符串结束标志。在这个程序中,我们开始定义的char型buffer数组长度为8,如果你输入的密码长度不等于8的话,那么这个密码验证程序的功能还是完善的,但是如果你的密码长度为8的话,这个栈溢出漏洞的危害就显现出来了。密码长度为8,buffer字符串数组的’结束标志就会溢出至int authenticated的内存空间内,并将原来的数据覆盖。

        观察源代码我们不难发现,authenticated变量的值来源于strcmp函数的返回值,之后会返回给main函数作为密码验证成功与否的标志变量:当authenticated为0时,表示验证成功,反之,验证不成功。

光说不管用,下面我们用ollydbg来验证一下到底是不是这样。

win7环境下的栈溢出与实战

图4

这里,我们输入8个q。

win7环境下的栈溢出与实战

图5

win7环境下的栈溢出与实战

图6

在ASCII中71代表q。

在图6中,我们可以清楚地看到,8个q将buffer数组全部占满,字符串截断符溢出至0018FB4C(即原authenticated的位置)。

栈的具体变化情况如下表:

win7环境下的栈溢出与实战

通过上面的解释,我想大家对栈溢出有了个初步的认识。在这里介绍的栈溢出漏洞看起来很简单,但实际上栈溢出是最常见的内存错误之一,也是***者***系统时所用到的最强大、最经典的一类漏洞利用方式。

注意:

1、 在观察内存的时候应当注意内存数据与数值数据的区别,电脑在存储数据的时候并不是按照我们平时记忆的方式存储。在调试环境中,内存有低到高分布,但在数值应用的时候确实由高位字节向低位字节进行解释。

2、 在输入密码时,如果你输入的字符串小于原来定义的密码,是不能冲破验证程序的。

3、 这个实验是在win7 64位环境下完成的,在其他环境下栈溢出的原理相同,但内存地址不同。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享名称:win7环境下的栈溢出与实战-创新互联
标题URL:http://hbruida.cn/article/dcidcc.html