緩沖溢出攻擊是如何發(fā)生的
我不確信我完全理解緩沖區(qū)溢出。我知道在向目標(biāo)機(jī)器插入代碼時(shí)會(huì)導(dǎo)致嚴(yán)重的緩沖區(qū)管理缺陷,但我不知道黑客是怎樣來使這些代碼得以執(zhí)行的——很可能是在他或她獲得了目標(biāo)機(jī)器的控制權(quán)的時(shí)候發(fā)生的。黑客能夠保證代碼被調(diào)用嗎?亦或者這其實(shí)僅僅是一個(gè)概率問題?
專家回答:
當(dāng)程序或進(jìn)程試圖在其分配的數(shù)據(jù)存儲(chǔ)區(qū)域、或緩沖區(qū)中存儲(chǔ)超出預(yù)計(jì)的數(shù)據(jù)時(shí),緩沖區(qū)溢出就會(huì)發(fā)生。由于創(chuàng)建的緩沖區(qū)中只能存儲(chǔ)有限的數(shù)據(jù),額外的信息會(huì)溢出到鄰近的緩沖區(qū)中。當(dāng)這種情況發(fā)生時(shí),原來存儲(chǔ)在這些緩沖區(qū)中的有效數(shù)據(jù)會(huì)被破壞或覆蓋。函數(shù)中的局部變量的緩沖區(qū)溢出可能會(huì)覆蓋該函數(shù)的返回地址。(返回地址指向該函數(shù)執(zhí)行完成后應(yīng)該執(zhí)行的下一條指令)。這可能會(huì)導(dǎo)致段錯(cuò)誤,而段錯(cuò)誤(segmentation fault)則可以使程序崩潰。在某些特定情形下,程序崩潰后黑客會(huì)收到一個(gè)shell提示(shell prompt:提示用戶輸入命令行),這就把計(jì)算機(jī)的控制權(quán)交給了黑客。更復(fù)雜的攻擊是:黑客用期望執(zhí)行的代碼的指針重寫返回地址,而不僅僅是讓計(jì)算機(jī)崩潰。
基于堆棧的緩沖區(qū)溢出攻擊是最常見的,但讓我們看看在JPEG處理(GDI +)開發(fā)中基于堆的緩沖區(qū)侵占,見識(shí)緩沖區(qū)溢出攻擊的巧妙之處。
微軟的動(dòng)態(tài)鏈接庫(kù)文件稱為GDIPlus.dll,其中包含了圖形設(shè)備接口以及(GDI +)應(yīng)用程序編程接口(API)庫(kù)。它允許程序員表示圖形對(duì)象,并傳輸?shù)捷敵鲈O(shè)備--如顯示器和打印機(jī)。這些DLL有處理JPEG圖像文件的能力,但它在檢查其實(shí)際的值之前允許JPEG文件聲明注釋區(qū)域的長(zhǎng)度,。這時(shí)就可能會(huì)導(dǎo)致基于堆的緩沖區(qū)溢出?;诙训木彌_區(qū)攻擊發(fā)生在數(shù)據(jù)副本被寫入到位于堆內(nèi)的緩沖區(qū)的時(shí)候。這意味著非可執(zhí)行堆棧保護(hù)機(jī)制可以被繞過,最終導(dǎo)致系統(tǒng)十分脆弱,并允許黑客指向他們希望運(yùn)行的下一個(gè)進(jìn)程的代碼。諷刺的是,黑客可以在JPEG文件的注釋區(qū)域存儲(chǔ)這些代碼?,F(xiàn)在,只要被攻擊者查看已經(jīng)被篡改的圖像,黑客就可以利用這個(gè)漏洞了。
緩沖區(qū)溢出攻擊如此常見是因?yàn)榫帉懗绦蚴褂玫亩际羌?jí)別相對(duì)較低的編程語言,如匯編語言,C和C + +,它們沒有自動(dòng)給緩存定限的功能。因此程序檢查到數(shù)組或指針時(shí),要求程序員手動(dòng)管理分配內(nèi)存的大小。雖然黑客不能保證每一次溢出攻擊代碼都能成功運(yùn)行,但鑒于各種病毒以及蠕蟲的成功案例,可以說他們?nèi)匀豢梢杂泻芨叩某晒β省R榭淳彌_區(qū)溢出是如何進(jìn)行的,請(qǐng)?jiān)L問以下網(wǎng)站的Java程序演示:
http://nsfsecurity.pr.erau.edu/bom_docs/Demos/script.html。另外一個(gè)很好的初學(xué)者學(xué)習(xí)緩沖區(qū)溢出攻擊的網(wǎng)站是:
http://www.securiteam.com/securityreviews/5OP0B006UQ.html。
【編輯推薦】