关于标准库中有溢出危险的函数,如strcpy strcat springf gets等的问题

时间:2021-08-28 20:32:33
1. 诸如此类的标准库函数,为何有溢出危害?
2. 谁能总结个大全出来,以后编程的时候也省点心
3. 有无其他标准库中的函数可以替代这些不安全的函数?

9 个解决方案

#1


都没检查目的内存是否足够大存放下。

#2


没有检测目标内存的大小。
比如,可以利用溢出,改写之前压入栈中的函数返回地址,使程序跳转到它处。

#3


str ncpy 
str ncat 
s nprintf
这些函数都是可以指定缓冲区大小的

#4


strcpy_s 
strcat_s
sprintf_s
gets_s

这些如果超出输入的buffer大小,程序就会崩掉

#5


strncpy  
strncat
什么的虽然也是标准库函数,但是也不安全,因为如果你选择的n比缓冲区大或者有内存区域重叠的情况,都会出问题,而且strncpy很可能不会加'\0'。
没有更安全的标准库函数。但是VC2003以后里可以用都有strcpy_s之类的函数,它们都是安全的。strncpy_s可以指定是否总是添加\0,如果无法满足可以抛出异常。

#6


大家能不能在给出些其他常用的标准库中,有潜在出错可能的函数?

#7


编译器有个GS选项是可以阻止检查缓冲区溢出的,但也有方法可以绕过这个保护机制的。可以去看雪论坛看看
http://bbs.pediy.com/index.php

#8


这些所为危险函数的存在,最根本的原因是当前的计算机架构体系导致的,在现在的计算机模型中,代码和数据的区分不是很严格,计算机眼里数据和代码(规则)是一样的,这种色即是空空即是色的行为,导致上述函数的危险性提高了很大

#9


安全都是相对的。一顿吃10斤不含三聚氰胺的婴儿奶粉也会撑死人的。(^_^)

#1


都没检查目的内存是否足够大存放下。

#2


没有检测目标内存的大小。
比如,可以利用溢出,改写之前压入栈中的函数返回地址,使程序跳转到它处。

#3


str ncpy 
str ncat 
s nprintf
这些函数都是可以指定缓冲区大小的

#4


strcpy_s 
strcat_s
sprintf_s
gets_s

这些如果超出输入的buffer大小,程序就会崩掉

#5


strncpy  
strncat
什么的虽然也是标准库函数,但是也不安全,因为如果你选择的n比缓冲区大或者有内存区域重叠的情况,都会出问题,而且strncpy很可能不会加'\0'。
没有更安全的标准库函数。但是VC2003以后里可以用都有strcpy_s之类的函数,它们都是安全的。strncpy_s可以指定是否总是添加\0,如果无法满足可以抛出异常。

#6


大家能不能在给出些其他常用的标准库中,有潜在出错可能的函数?

#7


编译器有个GS选项是可以阻止检查缓冲区溢出的,但也有方法可以绕过这个保护机制的。可以去看雪论坛看看
http://bbs.pediy.com/index.php

#8


这些所为危险函数的存在,最根本的原因是当前的计算机架构体系导致的,在现在的计算机模型中,代码和数据的区分不是很严格,计算机眼里数据和代码(规则)是一样的,这种色即是空空即是色的行为,导致上述函数的危险性提高了很大

#9


安全都是相对的。一顿吃10斤不含三聚氰胺的婴儿奶粉也会撑死人的。(^_^)