C/C++中容易造成缓冲区溢出的函数
1、strcpy():字符串复制
2、strcat():字符串连接
3、gets():从输入流读取字符串到缓冲区
4、sprintf():打印字符串到缓冲区
5、vsprintf():打印字符串到缓冲区
6、scanf系列:从输入流读取格式化字符
7、strdup():字符串复制
1、strcpy():字符串复制
- 原型:char *strcpy(char *dest, const char *src);
- 功能:把src所指由'\0'结束的字符串复制到dest所指的数组中。
- 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
- 返回:指向dest的指针。
当src串长度>dest串长度时,程序仍会将整个src串复制到dest区域,可是dest数组已发生溢出。因此会导致dest栈空间溢出以致产生崩溃异常。
2、strcat():字符串连接
- 函数原型:char* strcat(char* des, char* src)。
- 函数功能:把src所指向的字符添加到dest结尾处(覆盖原dest结尾处的'\0'),并添加新的'\0'。
- 说明:des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。
- 返回值:指向des的指针
strcat函数常见的错误就是数组越界,即两个字符串连接后,长度超过第一个字符串数组定义的长度,导致越界。
3、gets():从输入流读取字符串到缓冲区
- 函数原型:char *gets(char *string)
- 函数功能:从输入流中读取字符串存在string中
- 返回值:若成功则返回string的指针,否则返回NULL。
注意:由于gets()不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃,可以使用fgets()代替。
4、sprintf():打印字符串到缓冲区
- 函数原型:int sprintf( char *buffer, const char *format [, argument,...] )
- 函数功能:sprintf与printf函数的区别:二者功能相似,但是sprintf函数打印到字符串中,而printf函数打印输出到屏幕上
- 返回值:成功则返回参数buffer字符串长度,失败则返回-1,错误原因存于errno 中。
注意:C语言对数组进行操作时并不检测数组的长度,如果buffer的长度不够,sprintf()很容易造成缓冲区溢出,带来意想不到的后果。使用snprintf()来代替sprintf()将能够很好的解决这个问题。
5、vsprintf():打印字符串到缓冲区
- 函数原型:int vsprintf(char *str, const char *format, va_list arg)
- 函数功能:根据参数format 字符串来转换并格式化数据, 然后将结果复制到参数str 所指的字符串数组, 直到出现字符串结束('\0')为止,它们可以用直接的方式模仿 strcpy() 行为。
- 返回值:如果成功,则返回写入的字符总数,否则返回一个负数。
注意:由于不检查字符串长度,这个函数也容易造成缓冲区溢出。
6、scanf系列:从输入流读取格式化字符
scanf系列的函数也设计得很差。在这种情况下,目的地缓冲区会发生溢出。
- scanf():从控制台输入 ,函数原型:int scanf(格式化字符串,输入列表);
- sscanf(): 从指定字符串输入,函数原型:int sscanf(字符串指针, 格式化字符串, 输入列表 );
- fscanf() :从文件输入 ,函数原型:int fscanf(文件指针,格式字符串,输入列表);
- vfscanf() : 在fscanf基础上增加了一个参数:va_list
- vscanf(): 在scanf基础上增加了一个参数 :va_list
- vsscanf():在sscanf基础上增加了一个参数 :va_list
7、strdup():字符串复制
- 函数原型:char *strdup(const char *s);
- 函数功能:拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s没有关联。strdup函数复制一个字符串,使用完后,要使用delete函数删除在函数中动态申请的内存,strdup函数的参数不能为NULL,一旦为NULL,就会报段错误,因为该函数包括了strlen函数,而该函数参数不能是NULL。
- 返回值:返回拷贝的字符串地址
strdup()的源码如下:
char * __strdup(const char *s)
{size_t len = strlen(s) +1;void *new = malloc(len);if (new == NULL)return NULL;return (char *)memecpy(new,s,len);
}
strdup会自动分配内存空间,并复制字符串。但strdup只malloc了内存,并没有释放。释放strdup内部动态分配的内存需要由调用者去做,如果调用者忘记free,则容易造成内存泄露。strdup与strcpy函数的区别如下:
- strcpy函数:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
- strdup函数返回指向被复制的字符串的指针,所需空间由malloc()函数分配且可以由free()函数释放。
- stdrup可以直接把要复制的内容复制给没有初始化的指针,因为它会自动分配空间给目的指针。strcpy的目的指针一定是已经分配好的内存指针。
参考:https://blog.csdn.net/eastlhu/article/details/28302647
C/C++中容易造成缓冲区溢出的函数相关推荐
- Android中的防缓冲区溢出技术
Android系统提供了非常严格的多层次的安全保护措施,包括代码.为了防止恶意用户采用恶意软件进行缓冲区溢出***或者进行"越狱"操作,自Android 4.0版本之后,内核就引入 ...
- CVE-2021-2429:MySQL InnoDB Memcached 插件中的堆缓冲区溢出漏洞详解
聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 2021年4月,ZDI 收到了一名匿名者提供的关于MySQL 数据库中某漏洞的报告,结果是位于 InnoDB memcached 插件中的基于堆 ...
- C/C++中容易造成内存溢出的函数
1.strcpy() strcpy()函数将源字符串复制到缓冲区.没有指定要复制字符的具体数目.复制字符的数目直接取决于源字符串中的数目.如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会 ...
- php 缓冲区溢出漏洞,在Linux 容器中对php-fpm缓冲区溢出漏洞的复现分析 ( CVE-2019-11043 )...
ubuntu@vulnerable:~$ curl http://localhost Hello World ubuntu@vulnerable:~$ 存在漏洞的容器已准备就绪,为容器做个快照,以备将 ...
- [转]浅谈缓冲区溢出之栈溢出
浅谈缓冲区溢出之栈溢出 By 浅墨 发表于 2012-12-02 有段时间没有用windows了,刚一开机又是系统补丁更新.匆匆瞥了一眼看到了"内核缓冲区溢出漏洞补丁"几个字眼.靠 ...
- VC++中利用/GS开关防止缓冲区溢出
2019独角兽企业重金招聘Python工程师标准>>> 转自:http://www.2cto.com/kf/201006/47769.html 缓冲区溢出通常表现为一个最为常见的漏洞 ...
- 缓冲区溢出漏洞攻击演示实验(CProxy 6.2缓冲区溢出漏洞)
实验内容: 分析缓冲区溢出漏洞,利用CCProxy 6.2的这个缓冲区溢出漏洞,利用ping命令向其发送一个长的字符串,溢出局部变量,覆盖RET的位置,从而实现程序跳转到自己想要让其执行的程序上去. ...
- C#不为人知的秘密-缓冲区溢出
开场白 各位朋友们,当你们看到网上传播关于微软windows.IE对黑客利用"缓冲区溢出".0day漏洞攻击的新闻,是否有过自己也想试试身手,可惜无从下手的感慨?本文将完全使用C# ...
- Windows 2000缓冲区溢出入门
前言 我在互联网上阅读过许多关于缓冲区溢出的文章.其中的绝大多数都是基于*NIX操作系统平台的.后来有幸拜读了ipxodi所著的<Windows系统下的堆栈溢出>(已刊登在绿盟网络安全月刊 ...
最新文章
- 一文看尽CVPR 2019十大新研究:“不看也知”成热点,无人车新增重磅开源数据集...
- matlab实现单纯型法解线性规划_【考研运筹学讲解】线性规划(一)
- LeetCode 2035. 将数组分成两个数组并最小化数组和的差(状态压缩DP)
- 协议处理程序初始化失败_域间路由协议的内容有哪些 域间路由协议的内容介绍【详解】...
- 【转】关于VB中Shell及ShellExecute的总结与记录
- 仿分词统计的MapReduce 程序。
- java -jar命令
- JSdom操作内容,样式,属性
- Android窗口系统第二篇---Window的添加过程
- 2022-2027年中国服装定制行业市场全景评估及发展战略规划报告
- 树莓派如何修改WIFI账户和密码
- 浪漫七夕—很幸运一路有你
- D. Harmonious Graph
- 面试 Redis 没底?这 40 道面试题让你不再慌(附答案)
- python数据分析之Pandas-3
- 关于《Robust outlier detection based on the changing rate of directed density ratio》的阅读笔记
- For queries with named parameters you need to use provide names for method parameters. Use @Param fo
- 【离散数学】关于欧拉图与哈密顿图的讨论
- 使用点云数据创建数字高程模型(DEM)
- 计算机发展历史简述及CPU构成及工作过程——Crash Course内容整理
热门文章
- 【Linux】Linux系统编程(入门与系统编程)(三)(深入理解操作系统、进程、环境变量、内存分布)
- 史诗级学术骗局!一博士狂编 200 多篇论文,被揭发后畏罪自杀....
- python窗口显示表格_Python tkinter Treeview创建GUI表格(可编辑、新建单元格)
- 三维数字矿山综合管理平台
- 心通达OA软件六大特色总结
- “话端午 做彩粽 包香包 传美德”端午节主题活动
- 操作系统——银行家算法(c语言)
- python循环计数器_简单Python循环计数器issu
- 深度强化学习DRL训练指南和现存问题(D3QN(Dueling Double DQN))
- 检查等高线矛盾lisp_毕业论文--地形图的制作.doc