乐趣区

关于c:什么是安全函数

公司的大佬说之前某大厂为了平安函数的替换耗资 10 亿美金。可想平安很重要,平安函数很重要,对于咱们做系统软件的来说很重要。

为什么要替换成平安函数,这外面就波及到了一种破绽攻打,缓冲区溢出攻打

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区自身的容量,溢出的数据笼罩在非法数据上。现实的状况是:程序会检查数据长度,而且并不容许输出超过缓冲区长度的字符。然而绝大多数程序都会假如数据长度总是与所调配的贮存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所应用的缓冲区,又被称为“堆栈”,在各个操作过程之间,指令会被长期贮存在“堆栈”当中,“堆栈”也会呈现缓冲区溢出。缓冲区溢出攻打是利用缓冲区溢出破绽所进行的攻打口头。利用缓冲区溢出攻打,能够导致程序运行失败、零碎关机、重新启动等结果。

缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者能够利用堆栈溢出,在函数返回时扭转返回程序的地址 ,让其跳转到任意地址,带来的危害一种是 程序解体导致拒绝服务 分段谬误(Segmentation fault),另外一种就是 跳转并且执行一段恶意代码,比方失去 shell,而后随心所欲。

C 语言没有提供字符串类型,字符串以字符数组的模式呈现,C 规范库提供了一些操作字符串的函数,次要有:strcmp 字符串比拟函数,strcpy 字符串拷贝函数,strlen 字符串测长函数,strcat 字符串连贯函数,sprintf 格式化字符串拷贝函数等等。因为字符串就是以‘\0’完结的一段内存 ,这些函数 本质上也就是操作内存的函数

也就是说,平安函数和非平安函数最大的差别就是:为了避免堆栈溢出,平安函数多了一个确定 buff 长度的参数。

举个例子:

非平安函数:

头文件:#include <string.h>
函数原型:char *strcpy(char *dest, const char *src);
函数阐明:把从 src 地址开始且含有 NULL 结束符的字符串复制到以 dest 开始的地址空间。src 和 dest 所指内存区域不能够重叠且 dest 必须有足够的空间来包容 src 的字符串。

平安函数:

头文件:#include <string.h>
函数原型:char *strncpy(char *dest, const char *src, size_t n);
函数阐明:把从 src 地址开始且含有 NULL 结束符的字符串复制到以 dest 开始的地址空间。最多复制 n 个字符。src 和 dest 所指内存区域不能够重叠且 dest 必须有足够的空间来包容 src 的字符串。

关注 && 分割

开源轻量操作系统:https://gitee.com/cmcc-oneos/OneOS-Lite

docs 文档核心:https://oneos-lite.com/

退出移动版