不安全的strcpy
strcpy
將src指向的以null結尾的字節字符串(包括null終止符)複製到dest指向其第一個元素的字符數組。
如果dest數組不夠大,則行爲未定義。 如果字符串重疊,則行爲未定義。 如果dest不是指向字符數組的指針,或者src不是指向以null結尾的字節字符串的指針,則行爲是未定義的。
strcpy
,strncpy
等函數都不安全.原因在於他們都不檢查邊界,極易造成棧溢出
.筆者在使用strcpy
時,發現有時候會檢測到棧溢出,有時候不會,故做了一次實驗.
-
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
char *test=(char *)malloc(2*sizeof(char));
這種情況,無法檢測到棧溢出.
strcpy
前的內存情況:
strcpy
後的內存情況:
printf()之後
的test2
內存情況:
但此處有一個問題,在printf("%s",test2);
之後,爲何test2
的內存發生了變化?
猜測是有可能其他棧函數修改了這個應不屬於test2
的內存位置.
char *test2="dh";
這種情況, 報錯段異常:
strcpy
前的內存情況:
報錯Segmentation fault
:
總結
對於strncpy``````strcpy
也是同理的,可能無意間就會修改錯誤的內存內容.
最好是使用strcpy_s()
等安全函數,如果不得已要使用原函數,就要做好邊界的計算處理.
故由於這個原因,有很多惡意程序注入
的方式,詳見我的這篇筆記,實際上是CSAPP
的一個lab
.