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

2.2.5 與函數(shù)無(wú)關(guān)的字符串錯(cuò)誤

大部分在標(biāo)準(zhǔn)字符串處理庫(kù)<string.h>中定義的函數(shù)都非常容易出錯(cuò),包括strcpy()、strcat()、strncpy()、strncat()和strtok()等。例如,微軟Visual Studio已經(jīng)廢棄了許多這樣的函數(shù)。盡管如此,由于空字符結(jié)尾的字符串是用字符數(shù)組實(shí)現(xiàn)的,因此,完全有可能在不調(diào)用任何函數(shù)的情況下做了不安全的字符串操作。下面的程序并沒(méi)有調(diào)用任何字符串庫(kù)函數(shù),然而卻包含了一個(gè)由字符串復(fù)制操作導(dǎo)致的缺陷。


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  }

這個(gè)有缺陷的程序接受一個(gè)字符串參數(shù),并將其復(fù)制到buff字符數(shù)組,然后打印buff中的內(nèi)容。變量buff被聲明為一個(gè)128個(gè)字符長(zhǎng)的定長(zhǎng)數(shù)組。如果提供給程序的第一個(gè)參數(shù)等于或者超過(guò)128個(gè)字符(請(qǐng)記住還有結(jié)尾的空字符),這個(gè)程序就會(huì)在數(shù)組的邊界外進(jìn)行寫(xiě)操作。

顯然,消除對(duì)危險(xiǎn)函數(shù)的使用并不能保證你的程序就能夠避免安全缺陷。在接下來(lái)的幾節(jié)中,你將會(huì)看到這些安全缺陷是如何導(dǎo)致可被利用的漏洞的。

主站蜘蛛池模板: 慈溪市| 金昌市| 乌兰县| 鄯善县| 视频| 通州市| 右玉县| 肥乡县| 柏乡县| 克拉玛依市| 庆安县| 迁安市| 沙河市| 田东县| 峡江县| 边坝县| 福鼎市| 岚皋县| 丘北县| 泰和县| 凭祥市| 肇东市| 定结县| 勃利县| 崇信县| 辉南县| 彭州市| 普宁市| 金塔县| 南投市| 嘉黎县| 恩平市| 南召县| 平谷区| 岢岚县| 万荣县| 伊通| 大石桥市| 宁化县| 古田县| 鄂伦春自治旗|