c 和 c++ 不能夠自動地做邊界檢查,邊界檢查的代價是效率。一般來講,c 在大多數情況下注重效率。然而,獲得效率的代價是,c 程式設計師必須十分警覺以避免緩衝區溢位問題。
c語言標準庫中的許多字串處理和io流讀取函式是導致緩衝區溢位的罪魁禍首。我們有必要了解這些函式,在程式設計中多加小心。
微軟對於有緩衝溢位危險的api使用其開發的安全版本的庫來替代。
safecrt自visual studio 2005起開始支援。當**中使用了禁用的危險的crt函式,visual studio 2005編譯時會報告相應警告資訊,以提醒開發人員考慮將其替代為safe crt中更為安全。
有關字串拷貝的api
例如:strcpy, wcscpy等
替代的safe crt函式:strcpy_s
有關字串合併的api
例如:strcat, wcscat等
替代的safe crt函式:strcat_s
有關sprintf的api
例如:sprintf, swprintf等
替代的safe crt函式:
_snprintf_s
_snwprintf_s
其它被禁用的api還有scanf, strtok, gets, itoa等等。 」n」系列的字串處理函式,例如strncpy等,也在被禁用之列。
破解下面的密碼防護**:
#include
int main(int argc, char *argv)
if(flag)
else
return
0;}
如果把命令列輸入的文字當作密碼的話,會有很大的漏洞:
首先如果我輸入11個字元且最後乙個字元是大於0的話,就慘了,strcpy是要copy到』/0』的。他會一直把這11個字元都copy到passwd陣列中,此時陣列越界了,最後乙個字元就把flag標誌位個賦值了,if條件就滿足了,密碼就被破解了!
經過上面我們的討論,我們可以對使用者輸入動態分配同樣大小的空間,而不是提前分配固定的空間。
passwd = (char *)malloc(strlen(argv[1]));
strcpy(passwd, argv[1]);
注意:
不要用strncpy(),它會造成最後一位的丟失,造成隱藏的錯誤。
由於函式呼叫棧頭部會儲存其呼叫者棧的基位址%ebp,如果破壞了儲存%ebp的值,那麼基址暫存器就不能正確地恢復,因此呼叫者就不能正確地引用它的區域性變數或引數。
如果破壞了儲存的返回位址,那麼ret指令會使程式跳轉到完全意想不到的地方。
緩衝區溢位的乙個更加致命的使用就是讓程式執行它本來不願意執行的函式。這是一種最常見的通過計算機網路攻擊系統安全的方法。通常,輸入給程式乙個字串,這個字串包含一些可執行**的位元組編碼,稱為攻擊**,另外還有一些位元組會用乙個指向攻擊**的指標覆蓋返回位址。那麼,執行ret指令的效果就是跳轉到攻擊**。
關於緩衝區溢位,見本部落格中的:
[參考鏈結]
c語言不安全庫 C語言 那些不安全的庫函式
c語言 那些不安全的庫函式 c和c 不能夠自動地做邊界檢查,邊界檢查的代價是效率。一般來講,c 在大多數情況下注重效率。然而,獲得效率的代價是,c 程式設計師必須十分警覺以避免緩衝區溢位問題。c語言標準庫中的許多字串處理和io流讀取函式是導致緩衝區溢位的罪魁禍首。我們有必要了解這些函式,在程式設計中...
C中的危險函式 緩衝區溢位
c語言,自創始以來,到現在經久不衰。雖然c你只好自己造輪子,由於c語言允許直接訪問實體地址,可以直接對硬體進行操作,因此它既具有高階語言的功能,又具有低階語言的特性。所以有可移植的彙編之稱。可是也在這些直接對記憶體的訪問,導致了危險的發生。有了自由也就多了混亂 某斯基 第一位公共敵人就是是 gets...
怎樣處理Android中的防緩衝區溢位技術
51cto專稿 本文將詳細介紹android中的防緩衝區溢位技術的來龍去脈。1 什麼是aslr?aslr address space layout randomization 是一種針對緩衝區溢位的安全保護技術,通過對堆 棧 共享庫對映等線性區布局的隨機化,通過增加攻擊者 目的位址的難度,防止攻擊者...