緩衝區溢位一般是由於一下原因導致:
1.字串處理函式沒有指定長度,單單憑藉結尾字元是不是'\0'來判斷結束。
2.被處理的字元超過緩衝區可接受的大小。例如,從螢幕輸入字串:gets(buff),但是buff的記憶體少於螢幕一行字元個數,就會導致溢位,應該使用fgets。
3.所有格式化字串的函式:fprintf("%n",&num_write)。
避免的辦法:
1.不要用%n formatter
2.不要把使用者的輸入作為引數傳到格式化字串處理函式中,例如,printf("%s", argv[1])。
3.字串處理避免使用strcpy,strcat,sprintf,gets。應該使用strncpy,strncat,snprintf。strlcpy和strlcat都是null結尾。盡量使用std::string,mfc::cstring
4.使用c++ i/o函式
5.使用安全的c runtime time函式*_s function,關於安全函式請看
6.檢查檔案路徑的長度,不要超過系統允許的最大值。
1.靜態檢查工具:klocwork,intel compiler
2.動態檢查工具:pageheap,valgrind
3.ms compiler:
(1)緩衝區安全檢查:/gs
(2)資料執行保護(compatibility with data execution protection):/nxcompat。具體參見:
(3)安全的異常處理:/safeseh。具體參見:
4.gcc compiler:
(1)gcc -fstack-protector 具體參見:
(2)ld -pie (gcc -fpie),這個需要核心支援aslr,具體參見:
(3)gcc -d_fortify_source=2 -o2,編譯時檢查和執行時檢查,格式化字串%n將被禁止。
(4)gcc -wformat -wformat-security,檢查格式化型別
緩衝區溢位
緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程...
緩衝區溢位
緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測 理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元 向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。通過往程式的緩衝區寫超出其長度的內容,造成...
緩衝區溢位 棧溢位
1 緩衝區概念 緩衝區 buffer 又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。使用緩衝區有兩個好處 1 減少實際物理讀寫次數 2 緩衝區在建立時就被分配記憶體,這塊記憶體區域一直被重用,可以...