日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
CPU阿甘之緩沖區(qū)溢出

我是大家的老朋友CPU阿甘, 每天你一開機,我就忙得不亦樂乎,從內(nèi)存中讀取一條條的指令,挨個執(zhí)行。

專注于為中小企業(yè)提供成都網(wǎng)站制作、成都做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)大英免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了數(shù)千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

最早的時候我認為程序都是順序執(zhí)行的,后來發(fā)現(xiàn)并不是這樣,經(jīng)常會出現(xiàn)一條跳轉(zhuǎn)指令,讓我到另外一個內(nèi)存地址處去下一條指令去執(zhí)行。

時間久了我就明白這是人類代碼中的if ... else ,或者for ,while等循環(huán)導(dǎo)致的。

這樣跳來跳去,讓我覺得有點頭暈,不過沒有辦法,這是人類做出的規(guī)定。

后來我發(fā)現(xiàn),有些指令經(jīng)常會出現(xiàn)重復(fù),尤其是下面這幾個:

  • pushl    %ebp
  • movl     %esp %ebp
  • call  xxxx
  • ret

正當(dāng)我疑惑的時候,內(nèi)存炫耀地說:這些指令是為了函數(shù)調(diào)用,建立棧幀所所必需的啊。

“函數(shù)調(diào)用?這是什么鬼?”

“函數(shù)調(diào)用你都不知道? 我告訴你吧,現(xiàn)在的計算機語言,甭管你是面向?qū)ο筮€是函數(shù)式、動態(tài)還是靜態(tài)、解釋還是編譯,只要想在我們馮諾依曼體系結(jié)構(gòu)下運行,最終都得變成順序、循環(huán)、分支,以及函數(shù)調(diào)用!”

內(nèi)存說著給我舉了一個例子:

這個例子非常簡單,一看就明白。

“但是棧幀是什么?”

“阿甘你知道棧是什么意思吧?”

“不就是一個先進后出的數(shù)據(jù)結(jié)構(gòu)嗎?”

“對,通俗來說:一個棧幀就是這個棧中的一個元素,表示了一個函數(shù)在運行時的結(jié)構(gòu)?!?內(nèi)存繼續(xù)給我科普:

“你這種畫法好古怪,怎么倒過來了,棧底在上方,棧頂反而在下方!”

“這也是人類規(guī)定的,一個進程的虛擬內(nèi)存中有個區(qū)域,就是棧,這個棧就是從高地址向低地址發(fā)展的啊?!?/p>

“奧,原來我執(zhí)行的代碼在一個叫做代碼區(qū)的地方存放著啊,執(zhí)行的時候會操作你的棧,對不對?”

“沒錯,我再給你看看那個棧幀的內(nèi)部結(jié)構(gòu)吧!”

這張圖看起來很復(fù)雜,但是和代碼一對應(yīng),還是比較清楚的。

我心中模擬了一下這個執(zhí)行過程,hello()函數(shù)正在被執(zhí)行,當(dāng)要調(diào)用add函數(shù)的時候,需要準備參數(shù),即x = 10, y=20 。

還要記錄下返回地址,即printf(....)這個指令在內(nèi)存的地址。當(dāng)add函數(shù)調(diào)用完成以后,就可以返回到這里執(zhí)行了。

真正開始執(zhí)行add函數(shù)的時候,也需要給它建立一個棧幀(其中要記錄下上個函數(shù)棧幀的開始地址),還有這個函數(shù)的參數(shù),在棧幀也會分配內(nèi)存空間,例如sum, buf等。

等到執(zhí)行結(jié)束,add函數(shù)的棧幀就廢棄了(相當(dāng)于從棧中彈出),找到返回地址,繼續(xù)執(zhí)行printf指令。

hello函數(shù)執(zhí)行完畢,也會廢棄掉,回到上一個函數(shù)的棧幀,繼續(xù)執(zhí)行,如此持續(xù)下去....

我對內(nèi)存說:“明白了,我已經(jīng)迫不及待地想執(zhí)行一下這個函數(shù),看看效果了?!?/p>

內(nèi)存說:“真的明白了?正好,操作系統(tǒng)老大已經(jīng)發(fā)出指令,讓我們運行了,開始吧!”

建立hello函數(shù)的棧幀,調(diào)用add函數(shù),建立add棧幀,執(zhí)行add函數(shù)的代碼, 一切都很順利。

add函數(shù)中調(diào)用了scanf ,要求用戶輸入一些數(shù)據(jù),人類是超級慢的,我耐心等待。

用戶輸入了8個字符A,我把他們都放到了buf所在的內(nèi)存中:

但是人類還在輸入,接下里是一些很奇怪的數(shù)據(jù),其長度遠遠超過了char buf[8]中的8個字節(jié)。

可是我還得把數(shù)據(jù)給放到內(nèi)存中啊,于是函數(shù)棧幀就變成了這個樣子。

(注:用戶輸入的數(shù)據(jù)是從低地址向高地址存放的。)

我覺得特別古怪的是,這個返回地址也被沖掉了,被改寫了。

這個用戶到底要干啥?

add函數(shù)執(zhí)行完畢,要返回到hello函數(shù)了, 我明明知道返回地址已經(jīng)被改掉, 可是我沒有選擇,還得把那個新的(用戶輸入的)返回地址給取出來, 老老實實地去那個地址取出下一條指令去執(zhí)行。

完了,這根本就不是原來的prinf函數(shù),而是一段惡意代碼的入口!

分割線

與此同時....

黑客三兄弟中的老三大叫: 大哥二哥,我的這次緩沖區(qū)溢出攻擊實驗成功了!

“不錯啊,你是怎么搞的?” 老大問道。

“正如二哥說的,那個scanf函數(shù)沒有邊界檢查,我成功地把代碼注入到了棧幀中,并且修改了返回地址!于是程序就跳到我指定的地方執(zhí)行了?!?/p>

【本文為專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號coderising獲取授權(quán)】

戳這里,看該作者更多好文


本文名稱:CPU阿甘之緩沖區(qū)溢出
分享路徑:http://m.5511xx.com/article/coehdcp.html