c语言strcpy漏洞攻击,C中strcpy漏洞

博客探讨了C语言中strcpy函数的使用问题,指出该函数在复制字符串时可能导致内存溢出的安全隐患。文章分析了strcpy函数的工作原理,并提供了一个更安全的stringcopy函数实现,强调了在使用字符串操作函数时需要考虑内存安全和性能的平衡。同时,讨论了C、C++和Java等语言在处理这类问题上的差异,以及程序员在编写代码时的责任。
摘要由CSDN通过智能技术生成

#include

#include

int main(void)

{

char s[] = "123456789";

char d[] = "123";

strcpy(d,s);

printf ("%s,\n%s",d,s);

return 0;

}

输出是:

123456789,

56789

0818b9ca8b590ca3270a3433284dd417.png ======>

0818b9ca8b590ca3270a3433284dd417.png

原因:当开辟出s[]和d[]两个数组的内存单元时,内存是连续的,存放的方式如下:

s数组地址:0x0012ff74,存的值:123456789(隐含值'\0')

d数组地址:0x0012ff70,存的值:123(隐含值'\0')

即内存中的情况是:123\0123456789\0,strcpy以后就变成了123456789\07890

而此时,s和d的地址是没变的 依次指向:

1 2 3 \0 1 2 3 4 5 6 7 8 9 \0            ====>         1 2 3 4 5 6 7 8 9 \0 7 8 9 0

d           s                                                         d         s

无论输出d数组还是s数组都是遇到'\0'结束,因此输出自然是123456789和56789啦~~

知识链接:

微软的strcpy函数是这么写的:

char *cdecl strcpy(char *dst, const char * src)

{

char *cp = dst;

while(*cp++ = * src++)

;

return (dst);

}

分析可知,这样安全漏洞太多了,所以用这个函数必须小心,给目标字符串分配足够的空间才行~~

从上面我们可以看到这样的代码有问题有:

1.没有检查输入的两个指针是否有效。

2.没有检查两个字符串是否以NULL结尾。

3.没有检查目标指针的空间是否大于等于原字符串的空间。

后续思考:

牛人这么多的微软,怎么就没想到这个小小的拷贝函数会造成这么大的安全隐患呢?答案很简单:为了提高性能,减去那些啰嗦的安全检查是必要的。而且,程序员应该知道哪些条件会发生访问违例。这种做法就是把责任推给了程序员,让他来决定安全与性能的取舍(摘自程序员面试宝典)。我想,这也就是C,C++和java等语言的最大区别吧。。真的很深奥又很美好的一门语言啊。

一个拷贝函数的完整的标准写法是这样滴:

#include

#include

#include

void stringcopy(char *to, const char *from)

{

assert(to != NULL && from != NULL);

while(*from != '\0')

{

*to ++ = *from++;

}

*to = '\0';

}

int main(void)

{

char *f;

f = (char *) malloc (15);

stringcopy (f, "hello stringcopy!");

printf ("%s\n",f);

return 0;

}

但是这里有个疑问,严重的疑问。既然是一个完整的标准写法,应该涉及到检查to也就是目标字符串的可预存空间,并只能将值赋在这个空间内,不可越界,这才是真正的安全吧。。。那就涉及到要给stringcopy函数传一个目标字符串预存空间的大小值了。。哦哦,是不是又太麻烦呢。。欢迎各位指正~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值