棧溢出利用
To be the apostrophe which changed“Impossible”into“I’m possible”
——failwest
當(dāng)軟件中存在數(shù)組越界等問題時,一切皆有可能。您很快就能夠領(lǐng)會到把“Impossible”變成“I’m possible”的那一撇是怎樣被寫進Windows的。
1 系統(tǒng)棧的工作原理
1.1 內(nèi)存的不同用途
如果您關(guān)注過網(wǎng)絡(luò)安全問題,那么一定聽過緩沖區(qū)溢出這個術(shù)語。簡單說來,緩沖區(qū)溢出就是在大緩沖區(qū)中的數(shù)據(jù)向小緩沖區(qū)復(fù)制的過程中,由于沒有注意小緩沖區(qū)的邊界,“撐爆”了較小的緩沖區(qū),從而沖掉了和小緩沖區(qū)相鄰內(nèi)存區(qū)域的其他數(shù)據(jù)而引起的內(nèi)存問題。緩沖溢出是最常見的內(nèi)存錯誤之一,也是攻擊者入侵系統(tǒng)時所用到的大、最經(jīng)典的一類漏洞利用方式。
成功地利用緩沖區(qū)溢出漏洞可以修改內(nèi)存中變量的值,甚至可以劫持進程,執(zhí)行惡意代碼,最終獲得主機的控制權(quán)。要透徹地理解這種攻擊方式,我們需要回顧一些計算機體系架構(gòu)方面的基礎(chǔ)知識,搞清楚CPU、寄存器、內(nèi)存是怎樣協(xié)同工作而讓程序流暢執(zhí)行的。
根據(jù)不同的操作系統(tǒng),一個進程可能被分配到不同的內(nèi)存區(qū)域去執(zhí)行。但是不管什么樣的操作系統(tǒng)、什么樣的計算機架構(gòu),進程使用的內(nèi)存都可以按照功能大致分成以下4個部分。
(1)代碼區(qū):這個區(qū)域存儲著被裝入執(zhí)行的二進制機器代碼,處理器會到這個區(qū)域取指并執(zhí)行。
(2)數(shù)據(jù)區(qū):用于存儲全局變量等。
(3)堆區(qū):進程可以在堆區(qū)動態(tài)地請求一定大小的內(nèi)存,并在用完之后歸還給堆區(qū)。動態(tài)分配和回收是堆區(qū)的特點。
(4)棧區(qū):用于動態(tài)地存儲函數(shù)之間的調(diào)用關(guān)系,以保證被調(diào)用函數(shù)在返回時恢復(fù)到母函數(shù)中繼續(xù)執(zhí)行。
題外話:這種簡單的內(nèi)存劃分方式是為了讓您能夠更容易地理解程序的運行機制?!渡钊肜斫庥嬎銠C系統(tǒng)》一書中有更詳細的關(guān)于內(nèi)存使用的論述,如有興趣可參考之。
在Windows平臺下,高級語言寫出的程序經(jīng)過編譯鏈接,最終會變成第2章介紹過的PE文件。當(dāng)PE文件被裝載運行后,就成了所謂的進程。
PE文件代碼段中包含的二進制級別的機器代碼會被裝入內(nèi)存的代碼區(qū)(.text),處理器將到內(nèi)存的這個區(qū)域一條一條地取出指令和操作數(shù),并送入算術(shù)邏輯單元進行運算;如果代碼中請求開辟動態(tài)內(nèi)存,則會在內(nèi)存的堆區(qū)分配一塊大小合適的區(qū)域返回給代碼區(qū)的代碼使用;當(dāng)函數(shù)調(diào)用發(fā)生時,函數(shù)的調(diào)用關(guān)系等信息會動態(tài)地保存在內(nèi)存的棧區(qū),以供處理器在執(zhí)行完被調(diào)用函數(shù)的代碼時,返回母函數(shù)。這個協(xié)作過程
如果把計算機看成一個有條不紊的工廠,我們可以得到如下類比: CPU是完成工作的工人。
數(shù)據(jù)區(qū)、堆區(qū)、棧區(qū)等則是用來存放原料、半成品、成品等各種東西的場所。
存在代碼區(qū)的指令則告訴CPU要做什么,怎么做,到哪里去領(lǐng)原材料,用什么工具來做,做完以后把成品放到哪個貨艙去。
值得一提的是,棧除了扮演存放原料、半成品的倉庫之外,它還是車間調(diào)度主任的辦公室。
程序中所使用的緩沖區(qū)可以是堆區(qū)、棧區(qū)和存放靜態(tài)變量的數(shù)據(jù)區(qū)。緩沖區(qū)溢出的利用方法和緩沖區(qū)到底屬于上面哪個內(nèi)存區(qū)域密不可分,本章主要介紹在系統(tǒng)棧中發(fā)生溢出的情形。
To be the apostrophe which changed“Impossible”into“I’m possible”
——failwest
當(dāng)軟件中存在數(shù)組越界等問題時,一切皆有可能。您很快就能夠領(lǐng)會到把“Impossible”變成“I’m possible”的那一撇是怎樣被寫進Windows的。
1 系統(tǒng)棧的工作原理
1.1 內(nèi)存的不同用途
如果您關(guān)注過網(wǎng)絡(luò)安全問題,那么一定聽過緩沖區(qū)溢出這個術(shù)語。簡單說來,緩沖區(qū)溢出就是在大緩沖區(qū)中的數(shù)據(jù)向小緩沖區(qū)復(fù)制的過程中,由于沒有注意小緩沖區(qū)的邊界,“撐爆”了較小的緩沖區(qū),從而沖掉了和小緩沖區(qū)相鄰內(nèi)存區(qū)域的其他數(shù)據(jù)而引起的內(nèi)存問題。緩沖溢出是最常見的內(nèi)存錯誤之一,也是攻擊者入侵系統(tǒng)時所用到的大、最經(jīng)典的一類漏洞利用方式。
成功地利用緩沖區(qū)溢出漏洞可以修改內(nèi)存中變量的值,甚至可以劫持進程,執(zhí)行惡意代碼,最終獲得主機的控制權(quán)。要透徹地理解這種攻擊方式,我們需要回顧一些計算機體系架構(gòu)方面的基礎(chǔ)知識,搞清楚CPU、寄存器、內(nèi)存是怎樣協(xié)同工作而讓程序流暢執(zhí)行的。
根據(jù)不同的操作系統(tǒng),一個進程可能被分配到不同的內(nèi)存區(qū)域去執(zhí)行。但是不管什么樣的操作系統(tǒng)、什么樣的計算機架構(gòu),進程使用的內(nèi)存都可以按照功能大致分成以下4個部分。
(1)代碼區(qū):這個區(qū)域存儲著被裝入執(zhí)行的二進制機器代碼,處理器會到這個區(qū)域取指并執(zhí)行。
(2)數(shù)據(jù)區(qū):用于存儲全局變量等。
(3)堆區(qū):進程可以在堆區(qū)動態(tài)地請求一定大小的內(nèi)存,并在用完之后歸還給堆區(qū)。動態(tài)分配和回收是堆區(qū)的特點。
(4)棧區(qū):用于動態(tài)地存儲函數(shù)之間的調(diào)用關(guān)系,以保證被調(diào)用函數(shù)在返回時恢復(fù)到母函數(shù)中繼續(xù)執(zhí)行。
題外話:這種簡單的內(nèi)存劃分方式是為了讓您能夠更容易地理解程序的運行機制?!渡钊肜斫庥嬎銠C系統(tǒng)》一書中有更詳細的關(guān)于內(nèi)存使用的論述,如有興趣可參考之。
在Windows平臺下,高級語言寫出的程序經(jīng)過編譯鏈接,最終會變成第2章介紹過的PE文件。當(dāng)PE文件被裝載運行后,就成了所謂的進程。
PE文件代碼段中包含的二進制級別的機器代碼會被裝入內(nèi)存的代碼區(qū)(.text),處理器將到內(nèi)存的這個區(qū)域一條一條地取出指令和操作數(shù),并送入算術(shù)邏輯單元進行運算;如果代碼中請求開辟動態(tài)內(nèi)存,則會在內(nèi)存的堆區(qū)分配一塊大小合適的區(qū)域返回給代碼區(qū)的代碼使用;當(dāng)函數(shù)調(diào)用發(fā)生時,函數(shù)的調(diào)用關(guān)系等信息會動態(tài)地保存在內(nèi)存的棧區(qū),以供處理器在執(zhí)行完被調(diào)用函數(shù)的代碼時,返回母函數(shù)。這個協(xié)作過程
如果把計算機看成一個有條不紊的工廠,我們可以得到如下類比: CPU是完成工作的工人。
數(shù)據(jù)區(qū)、堆區(qū)、棧區(qū)等則是用來存放原料、半成品、成品等各種東西的場所。
存在代碼區(qū)的指令則告訴CPU要做什么,怎么做,到哪里去領(lǐng)原材料,用什么工具來做,做完以后把成品放到哪個貨艙去。
值得一提的是,棧除了扮演存放原料、半成品的倉庫之外,它還是車間調(diào)度主任的辦公室。
程序中所使用的緩沖區(qū)可以是堆區(qū)、棧區(qū)和存放靜態(tài)變量的數(shù)據(jù)區(qū)。緩沖區(qū)溢出的利用方法和緩沖區(qū)到底屬于上面哪個內(nèi)存區(qū)域密不可分,本章主要介紹在系統(tǒng)棧中發(fā)生溢出的情形。