1. 程式人生 > >緩衝區溢位分析第01課:緩衝區溢位分析導論

緩衝區溢位分析第01課:緩衝區溢位分析導論

課程導論

        漏洞指的是在硬體、軟體、協議的具體實現或系統安全策略上存在的缺陷,通常是由程式的編寫者在編寫時的疏忽造成的。漏洞的存在使攻擊者能夠在未經允許的情況下訪問或者破壞目標系統,這在無形中給使用者系統的安全帶來了很大的威脅。

        一般來說,軟體漏洞並不影響程式的正常功能,但是如果被攻擊者成功利用,就有可能使得軟體去執行額外的惡意程式碼。漏洞挖掘和利用是一門非常高深的技術,甚至是一門藝術,這些都是頂級黑客才幹得了的活兒。

        大多數程式漏洞挖掘與記憶體破壞有關,比如最為常見的緩衝區溢位那樣的漏洞挖掘技術。使用這類技術的最終目標是控制目標程式的執行流程,以欺騙程式使其執行一段偷偷植入記憶體的惡意程式碼,這樣黑客就可以使程式做他想要做的幾乎任何事情。

說到溢位,可能在我們的頭腦中首先浮現出來的是水的溢位:


圖1 水的溢位

        水杯的大小是固定的,如果杯子沒有裝滿,那麼就不會有什麼問題。可是一旦裝滿了,還繼續裝的話,那麼這個時候,水就會不斷地溢位。

        在計算機內部,輸入資料通常被存放在一個臨時空間內,這個臨時存放的空間就被稱為緩衝區,緩衝區的長度事先已經被程式或者作業系統定義好了。向緩衝區內填充資料,如果資料的長度很長,超過了緩衝區本身的容量,那麼資料就會溢位儲存空間,而這些溢位的資料還會覆蓋在合法的資料上,這就是緩衝區和緩衝區溢位的道理。

        當然在理想的情況下,程式會檢查每個資料的長度,並且不允許超過緩衝區的長度大小,但有些程式會假設資料長度總是與所分配的儲存空間相匹配,而不做檢查,從而為緩衝區溢位埋下隱患。

        那麼我們應該如何利用緩衝區溢位呢?一般情況下,溢位的資料會覆蓋掉相鄰區域的內容。我們可以利用溢位的資料,使計算機執行我們想要的命令。這就是很多漏洞公告上說的:“黑客可以用精心構造的資料……”道理就是這樣。

        作為初學者,如果還不熟悉這個概念,可先把緩衝區溢位利用理解為允許攻擊者往某個程式變數中放一個比預期長度要長的值,由此以當前執行該程式的使用者的特權執行任意命令。

        第一個緩衝區溢位攻擊——Morris蠕蟲,發生在1988年,由羅伯特莫里斯(Robert Morris)製造,它曾造成全世界6000多臺網路伺服器癱瘓。時至今日,溢位攻擊依舊是安全領域的熱門話題,比如烏雲網(WooYun.org)總會有關於緩衝區溢位類漏洞的報告:


圖2 某軟體的緩衝區漏洞概要

        這是關於興業銀行的,提交於2014年9月22日的,關於“緩衝區溢位”的漏洞報告。下面是宜信平臺的溢位報告:


圖3 某平臺的堆疊溢位漏洞概要

        可見緩衝區溢位漏洞確實是普遍存在的。

        最後再講一下我們這個系列的課程安排,首先會給大家分析基礎的緩衝區溢位漏洞的原理以及利用方法,以及基礎 ShellCode的編寫方法,隨著課程的不斷深入,我會不斷地完善我們的 ShellCode,並且結合真實的漏洞案例進行分析。之後還會給大家介紹更多種類的緩衝區溢位方法,還有緩衝區溢位漏洞的高階防範措施等。我希望本系列的課程能夠培養大家的安全意識,擴充套件大家的思維,使得大家在學習完這一系列的課程之後,都能打下堅實的基礎,令每一位朋友都能夠成為安全領域的專家。