官术网_书友最值得收藏!

2.2.5 與函數無關的字符串錯誤

大部分在標準字符串處理庫<string.h>中定義的函數都非常容易出錯,包括strcpy()、strcat()、strncpy()、strncat()和strtok()等。例如,微軟Visual Studio已經廢棄了許多這樣的函數。盡管如此,由于空字符結尾的字符串是用字符數組實現的,因此,完全有可能在不調用任何函數的情況下做了不安全的字符串操作。下面的程序并沒有調用任何字符串庫函數,然而卻包含了一個由字符串復制操作導致的缺陷。


01  int main(int argc, char *argv[]) {
02    int i = 0;
03    char buff[128];
04    char *arg1 = argv[1];
05    if (argc == 0) {
06      puts("No arguments");
07      return EXIT_FAILURE;
08    }
10    while (arg1[i] != '\0') {
11      buff[i] = arg1[i];
12      i++;
13    }
14    buff[i] = '\0';
15    printf("buff = %s\n", buff);
16    exit(EXIT_SUCCESS);
17  }

這個有缺陷的程序接受一個字符串參數,并將其復制到buff字符數組,然后打印buff中的內容。變量buff被聲明為一個128個字符長的定長數組。如果提供給程序的第一個參數等于或者超過128個字符(請記住還有結尾的空字符),這個程序就會在數組的邊界外進行寫操作。

顯然,消除對危險函數的使用并不能保證你的程序就能夠避免安全缺陷。在接下來的幾節中,你將會看到這些安全缺陷是如何導致可被利用的漏洞的。

主站蜘蛛池模板: 锡林浩特市| 育儿| 昌平区| 荃湾区| 三门峡市| 英吉沙县| 客服| 密云县| 密云县| 泸水县| 宜川县| 深泽县| 肃北| 台中市| 沙湾县| 三台县| 平潭县| 新丰县| 宜春市| 梁河县| 台前县| 道真| 应城市| 商洛市| 桂平市| 汨罗市| 修水县| 正宁县| 铜陵市| 连江县| 会理县| 安康市| 噶尔县| 宝鸡市| 陵水| 靖安县| 彭山县| 霍州市| 高阳县| 达尔| 临海市|