不安全的 strcpy

strcpy

将src指向的以null结尾的字节字符串(包括null终止符)复制到dest指向其第一个元素的字符数组。
如果dest数组不够大,则行为未定义。 如果字符串重叠,则行为未定义。 如果dest不是指向字符数组的指针,或者src不是指向以null结尾的字节字符串的指针,则行为是未定义的。

strcpy , strncpy 等函数都不安全.原因在于他们都不检查边界,极易造成 栈溢出 .笔者在使用 strcpy 时,发现有时候会检测到栈溢出,有时候不会,故做了一次实验.

  1. char test[2];
    代码如下:

     #include <stdio.h>
     #include <stdlib.h>
     #include <string.h>
     int main()
         char *test="hellohellohellohellohellohellohellohellohellohellohello";
         char test2[2];
         //char *test2=(char*)malloc(2*sizeof(char));
         //char *test2 = "dh";
         strcpy(test2,test);
         printf("%s",test);
         //free(test2);
         return 0;
    

    这种情况下,是可以检测到栈溢出的.
    strcpy前的内存情况:
    在这里插入图片描述

    strcpy后的内存情况:
    在这里插入图片描述
    报错:stack smashing detected
    在这里插入图片描述

    1. char *test=(char *)malloc(2*sizeof(char));
      这种情况,无法检测到栈溢出.
      strcpy前的内存情况:
      在这里插入图片描述
      strcpy后的内存情况:
      在这里插入图片描述
      printf()之后test2内存情况:
      在这里插入图片描述

    但此处有一个问题,在printf("%s",test2);之后,为何test2的内存发生了变化?
    猜测是有可能其他栈函数修改了这个应不属于test2的内存位置.

    1. char *test2="dh";
      这种情况, 报错段异常:
      strcpy前的内存情况:
      在这里插入图片描述

    报错Segmentation fault:

    对于strncpy``````strcpy也是同理的,可能无意间就会修改错误的内存内容.
    最好是使用strcpy_s()等安全函数,如果不得已要使用原函数,就要做好边界的计算处理.

    故由于这个原因,有很多恶意程序注入的方式,详见我的这篇笔记,实际上是CSAPP的一个lab.

    不安全的strcpystrcpy将src指向的以null结尾的字节字符串(包括null终止符)复制到dest指向其第一个元素的字符数组。如果dest数组不够大,则行为未定义。 如果字符串重叠,则行为未定义。 如果dest不是指向字符数组的指针,或者src不是指向以null结尾的字节字符串的指针,则行为是未定义的。strcpy,strncpy等函数都不安全.原因在于他们都不检查边界,极易造成...
    微软已经知道strcat等函数不安全了,直接不让你通过了,而解决措施也告诉我们了。但是这里为了先看看strcat,所以先不用strcat_s。 如何忽略这个警告/错误,措施有以下几种: (1)第一种:_CRT_SECURE_NO_WARNINGS VS中:项目 - 属性 - 配置 - C/C++ - 预处理器 - 预处理器定义里添加:_CRT_SECURE_NO_WARNINGS (2)第二种: 加个预处理命令:#pragma warning(disable:4996) 这里注意:#pra..
    在c++中已经取消函数strcpy()函数,原因某些 C ++函数运行不安全,并且具有更安全的函数取代。而取代strcpy()的函数是strcpy_s(),接下来介绍strcpy_s()具体用法。 首先要包含头文件<cstring>,strcpy_s()函数被包含在此头文件中。 接着,strcpy_s()函数有三个参数
    文章目录引言函数调用约定(32位)程序编译运行攻击的思路填充数据jum esp地址编写shellcode完整攻击代码攻击效果公众号 在刚刚开始学校C语言的时候,很多人都用过strcpy这个函数。简单说是一个内存复制的函数。这个函数确实非常方便,但是这个函数是非常不安全,由与这个函数而产生的缓冲区溢出漏洞在很多文章中都有所介绍。我们应该摒弃strcpy的使用,而是用strncpy进行代替。 原型声明:char *strcpy(char* dest, const char *src); 头文件:#incl
    strcpystrcpy_s都是C语言中的字符串复制函数,但是它们有以下区别: 1. 参数不同:strcpy函数只有两个参数,分别是目标字符串和源字符串;而strcpy_s函数有三个参数,分别是目标字符串、目标字符串的大小和源字符串。 2. 安全性不同:strcpy函数没有对目标字符串的大小进行检查,容易导致缓冲区溢出等安全问题;而strcpy_s函数会在复制前检查目标字符串的大小,如果目标字符串的大小不足以容纳源字符串,则会返回错误码。 3. 可移植性不同:strcpy函数是标准C库函数,可以在各种平台上使用;而strcpy_s函数是Microsoft Visual C++的扩展函数,只能在Windows平台上使用。 因此,如果在Windows平台上编写C程序,建议使用strcpy_s函数,以提高程序的安全性。