【筆記】內存溢出

內存溢出可能有棧溢出(棧內存不夠分配),緩衝區溢出(接受用戶輸入、調用方法返回時,用的緩衝區不夠分配),堆溢出(就是對內存不夠分配,對象沒法建立,沒法new)安全

 

可能會形成安全漏洞:https://www.zhihu.com/question/40560123 楊博的答案服務器

  舉例:網絡

    從不受本身控制的來源獲取數據,同時又沒有對來源的數據大小作出限制,且在程序中毫無檢查和校驗的狀況下使用(調用可能表面上很正確的方法和對象/API),就會形成「棧溢出」、「緩衝區溢出」、「堆溢出」。函數

做者:楊博
連接:https://www.zhihu.com/question/40560123/answer/129719625
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

在C/C++中,不管棧溢出仍是緩衝區溢出都是安全漏洞的溫牀。spa

好比說C/C++標準庫有個strcpy,會一直複製內存,直到遇到\0。好比若是你用C++寫了一個遊戲服務器,其中讀取客戶端網絡包的代碼寫成這樣:線程

const int MAX_LENGTH = 16; bool is_administrator = false; char destination[MAX_LENGTH]; std::string source = read_string_from_client(); strcpy(destination, source.c_str()); 

 

那麼若是黑客構造出的source長於16字節,那麼就會修改到destination以外的內存。不少平臺的棧變量是跟按地址順序倒着分配的。因此destination溢出之後會修改先前定義的變量。好比黑客能夠用這個辦法把is_administrator修改爲true。
這種狀況就是緩衝區溢出攻擊。code

假如黑客黑掉服務器以後,把你的服務端程序偷出來開私服。因爲私服氾濫,遊戲失敗了。因而你的新遊戲決定拋棄了C++,改用C99標準的C語言。此次你這樣寫:對象

int length = read_int_from_client(); char buffer[length]; int data = read_int_from_client(); 

這裏會在棧上分配length字節的空間,而後再往棧頂放上一個data。當length很大時,會把data擠到棧空間以外。這種狀況下,假如編譯器生成的代碼沒有越界檢查的話,那麼黑客只要用客戶端發送特定的length和data組合,就可以改寫服務器的任意內存。黑客一般會修改服務器代碼的機器碼,好比注入一些jmp指令,讓線程跳到黑客想執行的函數。遊戲

那麼這一次你又被「棧溢出」攻擊黑掉了服務器。內存

相關文章
相關標籤/搜索