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