筆記 記憶體溢位

2022-02-26 20:08:28 字數 1139 閱讀 3857

記憶體溢位可能有棧溢位(棧記憶體不夠分配),緩衝區溢位(接受使用者輸入、呼叫方法返回時,用的緩衝區不夠分配),堆溢位(就是對記憶體不夠分配,物件無法建立,無法new)

可能會造成安全漏洞: 楊博的答案

舉例:從不受自己控制的**獲取資料,同時又沒有對**的資料大小做出限制,且在程式中毫無檢查和校驗的情況下使用(呼叫可能表面上很正確的方法和物件/api),就會造成「棧溢位」、「緩衝區溢位」、「堆溢位」。

比如說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。

這種情況就是緩衝區溢位攻擊。

假如黑客黑掉伺服器之後,把你的服務端程式偷出來開私服。由於私服氾濫,遊戲失敗了。於是你的新遊戲決定拋棄了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指令,讓執行緒跳到黑客想執行的函式。

那麼這一次你又被「棧溢位」攻擊黑掉了伺服器。

棧溢位,記憶體溢位

對於一台伺服器而言,每乙個使用者請求,都會產生乙個執行緒來處理這個請求,每乙個執行緒對應著乙個棧,棧會分配記憶體,此時如果請求過多,這時候記憶體不夠了,就會發生棧記憶體溢位。棧溢位是指不斷的呼叫方法,不斷的壓棧,最終超出了棧允許的棧深度,就會發生棧溢位,比如遞迴操作沒有終止,死迴圈。可以把記憶體比作...

linux 記憶體溢位排查 mysql記憶體溢位處理

業務場景 mysql 元件版本 mysql 5.7.25軟體架構 兩主兩從 01問題描述 mysql是乙個關係型資料庫管理系統,屬於oracle旗下產品。mysql是最流行的關係型資料庫管理系統之一,在web應用方面,mysql是最好的rdbms relational database manage...

mysql防止記憶體溢位 mysql記憶體溢位處理

主庫實列發生oom,例項程序由於占用記憶體達到linux系統的最大閾值,導致linux系統kill了mysql例項程序,可以通過如下方式檢視mysql使用了多少記憶體 檢視每個執行緒占用多少記憶體,然後乘以正在執行的執行緒 也就是排查sleep的 select read buffer size re...