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++中容易造成缓冲区溢出的函数相关推荐

  1. Android中的防缓冲区溢出技术

    Android系统提供了非常严格的多层次的安全保护措施,包括代码.为了防止恶意用户采用恶意软件进行缓冲区溢出***或者进行"越狱"操作,自Android 4.0版本之后,内核就引入 ...

  2. CVE-2021-2429:MySQL InnoDB Memcached 插件中的堆缓冲区溢出漏洞详解

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 2021年4月,ZDI 收到了一名匿名者提供的关于MySQL 数据库中某漏洞的报告,结果是位于 InnoDB memcached 插件中的基于堆 ...

  3. C/C++中容易造成内存溢出的函数

    1.strcpy() strcpy()函数将源字符串复制到缓冲区.没有指定要复制字符的具体数目.复制字符的数目直接取决于源字符串中的数目.如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会 ...

  4. php 缓冲区溢出漏洞,在Linux 容器中对php-fpm缓冲区溢出漏洞的复现分析 ( CVE-2019-11043 )...

    ubuntu@vulnerable:~$ curl http://localhost Hello World ubuntu@vulnerable:~$ 存在漏洞的容器已准备就绪,为容器做个快照,以备将 ...

  5. [转]浅谈缓冲区溢出之栈溢出

    浅谈缓冲区溢出之栈溢出 By 浅墨 发表于 2012-12-02 有段时间没有用windows了,刚一开机又是系统补丁更新.匆匆瞥了一眼看到了"内核缓冲区溢出漏洞补丁"几个字眼.靠 ...

  6. VC++中利用/GS开关防止缓冲区溢出

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://www.2cto.com/kf/201006/47769.html 缓冲区溢出通常表现为一个最为常见的漏洞 ...

  7. 缓冲区溢出漏洞攻击演示实验(CProxy 6.2缓冲区溢出漏洞)

    实验内容: 分析缓冲区溢出漏洞,利用CCProxy 6.2的这个缓冲区溢出漏洞,利用ping命令向其发送一个长的字符串,溢出局部变量,覆盖RET的位置,从而实现程序跳转到自己想要让其执行的程序上去. ...

  8. C#不为人知的秘密-缓冲区溢出

    开场白 各位朋友们,当你们看到网上传播关于微软windows.IE对黑客利用"缓冲区溢出".0day漏洞攻击的新闻,是否有过自己也想试试身手,可惜无从下手的感慨?本文将完全使用C# ...

  9. Windows 2000缓冲区溢出入门

    前言 我在互联网上阅读过许多关于缓冲区溢出的文章.其中的绝大多数都是基于*NIX操作系统平台的.后来有幸拜读了ipxodi所著的<Windows系统下的堆栈溢出>(已刊登在绿盟网络安全月刊 ...

最新文章

  1. 一文看尽CVPR 2019十大新研究:“不看也知”成热点,无人车新增重磅开源数据集...
  2. matlab实现单纯型法解线性规划_【考研运筹学讲解】线性规划(一)
  3. LeetCode 2035. 将数组分成两个数组并最小化数组和的差(状态压缩DP)
  4. 协议处理程序初始化失败_域间路由协议的内容有哪些 域间路由协议的内容介绍【详解】...
  5. 【转】关于VB中Shell及ShellExecute的总结与记录
  6. 仿分词统计的MapReduce 程序。
  7. java -jar命令
  8. JSdom操作内容,样式,属性
  9. Android窗口系统第二篇---Window的添加过程
  10. 2022-2027年中国服装定制行业市场全景评估及发展战略规划报告
  11. 树莓派如何修改WIFI账户和密码
  12. 浪漫七夕—很幸运一路有你
  13. D. Harmonious Graph
  14. 面试 Redis 没底?这 40 道面试题让你不再慌(附答案)
  15. python数据分析之Pandas-3
  16. 关于《Robust outlier detection based on the changing rate of directed density ratio》的阅读笔记
  17. For queries with named parameters you need to use provide names for method parameters. Use @Param fo
  18. 【离散数学】关于欧拉图与哈密顿图的讨论
  19. 使用点云数据创建数字高程模型(DEM)
  20. 计算机发展历史简述及CPU构成及工作过程——Crash Course内容整理

热门文章

  1. 【Linux】Linux系统编程(入门与系统编程)(三)(深入理解操作系统、进程、环境变量、内存分布)
  2. 史诗级学术骗局!一博士狂编 200 多篇论文,被揭发后畏罪自杀....
  3. python窗口显示表格_Python tkinter Treeview创建GUI表格(可编辑、新建单元格)
  4. 三维数字矿山综合管理平台
  5. 心通达OA软件六大特色总结
  6. “话端午 做彩粽 包香包 传美德”端午节主题活动
  7. 操作系统——银行家算法(c语言)
  8. python循环计数器_简单Python循环计数器issu
  9. 深度强化学习DRL训练指南和现存问题(D3QN(Dueling Double DQN))
  10. 检查等高线矛盾lisp_毕业论文--地形图的制作.doc