1. C/C++語言內存分布
一個C/C++編譯的程序所占用的系統(tǒng)內存一般分為以下幾個部分的內容:
1) 字符起始區(qū)塊(Blocks Started by Symbol segment,BSS segment)
通常是指用來存放程序中未初始化的全局變量或靜態(tài)變量的一塊內存區(qū)域。BSS段屬于靜態(tài)內存分配。
2) 數(shù)據(jù)段(data segment)
通常是指用來存放程序中已初始化的全局變量的一塊內存區(qū)域。數(shù)據(jù)段屬于靜態(tài)內存分配。
3) 代碼段(code segment/text segment)
通常是指用來存放程序執(zhí)行代碼的一塊內存區(qū)域。這部分區(qū)域的大小在程序運行前就已經確定,并且內存區(qū)域通常屬于只讀, 某些架構也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數(shù)變量,例如字符串常量等。
4) 堆(heap)
堆是用于存放進程運行中被動態(tài)分配的內存段,它的大小并不固定,可動態(tài)擴張或縮減。當進程調用malloc/free等函數(shù)分配內存時,新分配的內存就被動態(tài)添加到堆上,堆被擴張,當進程調用free/malloc則被釋放的內存從堆中被剔除,堆被縮減。堆向高地址方向生長。
堆一般由程序臨時創(chuàng)建和釋放,若程序員不釋放,程序結束時,可能由操作系統(tǒng)回收。
5) 棧(stack)
棧又稱堆棧, 存放程序的局部變量(但不包括static聲明的變量,static意味著在數(shù)據(jù)段中存放變量)。除此以外,在函數(shù)被調用時,棧用來傳遞參數(shù)和返回值。由于棧的后進先出特點,所以棧特別方便用來保存/恢復調用現(xiàn)場。棧向低地址方向生長。
2. 什么是內存泄漏
堆是動態(tài)分配內存的,并且可以分配使用很大的內存,使用不好會產生內存泄漏。頻繁地使用malloc和free會產生內存碎片。(類似磁盤碎片)
內存泄漏(memory leak)指的是由于疏忽或錯誤造成程序未能釋放已經不在使用的內存的情況。一般,內存泄漏指的是堆內存泄漏,是由于設計錯誤,失去了堆該段內存的控制,因為造成了內存的浪費,程序運行速度減慢甚至系統(tǒng)崩潰等嚴重后果。
應用程序一般使用malloc,calloc,realloc,new來從堆中申請一塊內存,使用結束以后,一定要使用free或delete釋放內存。
3. 棧空間大小
在Windows下,棧是由向低地址擴展的數(shù)據(jù)結構,是一塊連續(xù)的內存的區(qū)域,棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預先規(guī)定好的。
在Windows下,棧的默認大小一般是1M到2M。如果用的VS可以在設置里指定Stack Reserve大小,默認是1MB。Linux中,可以通過命令 ulimit -s 查看和設置linux的默認??臻g大小,默認情況下 為10240 即10M。
棧的速度快,但是空間小,不靈活。由于內存的讀取速度比硬盤快,當程序遇見大規(guī)模數(shù)據(jù)的頻繁存取時,開辟內存空間很有作用。
堆是向高地址擴展的數(shù)據(jù)結構,是不連續(xù)的內存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲空閑地址,自然是不連續(xù)的。鏈表的遍歷方向是由低地址向高地址的,堆的大小同時也收到系統(tǒng)中虛擬內存的限制??傮w而言堆內存使用較為靈活,但速度相對慢一些。
4. 什么是緩沖區(qū)溢出
緩沖區(qū)是程序運行時,內存中的一個連續(xù)塊,它保存了給定類型的數(shù)據(jù),隨著動態(tài)分配變量,可能會出現(xiàn)問題。
緩沖區(qū)溢出是指當前向緩沖區(qū)填充的數(shù)據(jù)位數(shù)超過了緩沖區(qū)自身容量的上限。
在計算機安全領域,緩沖區(qū)溢出就好比給自己的程序開了個后門,這種安全隱患是致命的。緩沖區(qū)溢出在各種操作系統(tǒng)、應用軟件中廣泛存在。而利用緩沖區(qū)溢出漏洞實施的攻擊就是緩沖區(qū)溢出攻擊。緩沖區(qū)溢出攻擊,可以導致程序運行失敗、系統(tǒng)關機、重新啟動,或者執(zhí)行攻擊者的指令,比如非法提升權限。
在當前網絡與分布式系統(tǒng)安全中,被廣泛利用的50%以上都是緩沖區(qū)溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩沖區(qū)溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數(shù)返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉并且執(zhí)行一段惡意代碼,比如得到shell,然后為所欲為。