strcpy的不安全之處

不安全的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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章