操作系统——缓冲区溢出
一、緩沖區溢出介紹
1988年,世界上第一個緩沖區溢出攻擊–Morris蠕蟲在互聯網上泛濫,短短一夜的時間全世界6000多臺網絡服務器癱瘓或半癱瘓,不計其數的數據和資料被毀。造成一場損失近億美元的空前大劫難!
那么,緩沖區溢出到底是怎么一回事呢?
緩沖區溢出就好比一個杯子倒太多的水,灑出來,這叫溢出。它是一種非常普遍、非常危險的漏洞,最常出現在C/C++編寫的程序中。
早期,人們還不那么重視安全的時候,往往會使用像strcpy這類不安全函數,這種函數對用戶的輸入不作任何檢查,總之,來自不拒,那么,分配的內存空間是有限的,如果輸入超長的字符串,必然會導致溢出。
講了這么多,小伙伴會不會有點暈嗎?其實,緩沖區溢出很容易理解的。下面我們看一個具體的例子:
#include<stdio.h>#include<string.h>int main(){char str[8];char input[256];gets(input);strcpy(str,input);return 0;}這段代碼存在一個經典的緩沖區溢出漏洞strcpy,為str變量分配了8個字節的空間,輸入小于等于8個字符,那沒問題:
但是當我們輸入超長的數據時,問題出現了
2、緩沖區溢出帶來的危害
上面是我們自己寫的程序,存在漏洞這沒什么大驚小怪并不會造成什么惡劣的影響。但是,如果問題出現在我們常用的一些軟件,比如操作系統,瀏覽器,QQ,那后果不堪想象。
緩沖區溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉并且執行一段惡意代碼,比如得到系統權限,然后為所欲為。
利用緩沖區溢出攻擊,可以導致程序運行失敗、系統宕機、重新啟動等后果。更為嚴重的是,它可被利用來執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。
有可能小伙伴你會對病毒/蠕蟲沒有概念,那我們來舉一個簡單的例子吧。平時玩電腦的時候,你正在聽歌,突然間收到未知的“朋友”發給你的一個m3u音頻文件,并引導你進行電擊——“這首歌很好聽呢,你也聽聽”。
湊巧的是,你電腦剛好了就裝了VUPlayer.exe 這個播放器,不多想,就打開這個音樂想聽聽看,奇怪的是,軟件閃了一下就退出了,你以為是文件損壞了了吧。其實,這個時候,你已經被黑了,沒錯!這就是那個播放器。
很普通的播放器,但是它存在致命緩沖區溢出漏洞。我們構造10000個A的m3u文件,然后用調試器附加VUPlayer.exe,打開文件:
我們看到下面的內存全部被字符A覆蓋了,其實就是使用了不安全的lstrcpyA函數導致溢出,這個是棧溢出,還有一種是堆溢出,但本質是一樣的。
證明有溢出漏洞之后,往往需要進一步分析寫利用代碼,不同的人目的不竟相同,類似我的很多安全愛好者之時彈彈計算器(在桌面上不停地彈出計算器工具),可是黑市上的人就會攻擊你的系統,盜取機密文件等等。當然,這只是一個簡單的實驗。
3、目前常見的保護措施
緩沖區攻擊的日漸泛濫,微軟并未任其張揚,陸陸續續推出了各種保存措施。其中重要的有GS,SafeSeh,ASLR,DEP等,接下來我們針對這些措施進行原理分析:
①.GS保護原理:
通過VC++編譯器在函數前后添加額外的處理代碼,前部分用于由偽隨機數生成的cookie并放入.data節段,當本地變量初始化,就會向棧中插入cookie,它位于局部變量和返回地址之間在緩沖區溢出利用時,如果將惡意代碼從局部變量覆蓋到返回地址,那么自然就會覆寫cookie,當檢測到與原始cookie不同時,就會觸發異常,最后終止進程。
②.SafeSeh保護
為了防止SEH節點被攻擊者惡意利用,微軟在.net編譯器中加入/sdeseh編譯選項引入SafeSEH技術。編譯器在編譯時將PE文件所有合法的異常處理例程的地址解析出來制成一張表,放在PE文件的數據塊(LQAJ)一C0N—FIG)中,并使用shareuser內存中的一個隨機數加密,用于匹配檢查。
如果該PE文件不支持safesEH,則表的地址為0。當PE文件被系統加載后,表中的內容被加密保存到ntdl1.dll模塊的某個數據區。在PE文件運行期間,如果發生異常需要調用異常處理例程,系統會逐個檢查該例程在表中是否有記錄:如果沒有則說明該例程非法,進而不執行該異常例程。
③.ASLR保護
ASLR(地址空間布局隨機化)技術的主要功能是通過對系統關鍵地址的隨機化,防止攻擊者在堆棧溢出后利用固定的地址定位到惡意代碼并加以運行。
④.DEP保護
數據執行保護 (DEP) 是一套軟硬件技術,能夠在內存上執行額外檢查以防止在不可運行的內存區域上執行代碼
這些保護機制的出現,一度使得攻擊難度大大增加,但攻擊者們也不是吃素的,他們也在研究繞過這些保護的辦法。所謂千里之堤潰于蟻穴,對于上面的保護,攻擊者只要找到了它們的一個弱點,便可以突破所有防線,實現攻擊。攻擊與防護,不斷在對抗,可以預見,在未來一段時間,這種游戲還將持續上演。
但是,現在的漏洞門檻比十年前高了N倍,筆者在實際中也常常遇到有漏洞卻不能利用的情況。但是也不要灰心,老的技術被淘汰,新的技術又會出來,本屬正常,但像緩沖區溢出這種經典的東西,無論什么時候,都值得我們學習。
注:
本文來自:https://zhuanlan.zhihu.com/p/21924662
溢出實例見:
https://www.cnblogs.com/clover-toeic/p/3737011.html
總結
以上是生活随笔為你收集整理的操作系统——缓冲区溢出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是珍珠状丘疹
- 下一篇: 操作系统——内存管理——分段和分页