国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
VC++中利用/GS開關(guān)防止緩沖區(qū)溢出
緩沖區(qū)溢出通常表現(xiàn)為一個(gè)最為常見的漏洞而存在于今天的各種軟件之中,黑客可以用惡意的輸入,從而更改程序的執(zhí)行流程,由此入侵相應(yīng)的進(jìn)程、電腦、或整個(gè)域。如果進(jìn)程運(yùn)行于一個(gè)高度受信的賬戶之下,如管理員或本地系統(tǒng)賬戶,那么黑客帶來的破壞將是極其嚴(yán)重,并有潛在廣泛傳播的危險(xiǎn)。近幾年來爆發(fā)的一些"知名"病毒,如紅色代碼、沖擊波、震蕩波等等,都源于C/C++代碼緩沖區(qū)溢出的結(jié)果。
  從程序的角度來看,緩沖區(qū)溢出只是一個(gè)再簡單不過的編程錯(cuò)誤--都是關(guān)于復(fù)制一個(gè)內(nèi)存區(qū)域的內(nèi)容到另一個(gè)內(nèi)存區(qū)域,而目標(biāo)內(nèi)存區(qū)域容量太小無法容納。以下的代碼作了簡單的演示:
char* source = "A reasonably long string";
char dest[10];
::strcpy(dest, source);
  在本例中,源字符串的長度為25個(gè)字符(包括了空結(jié)束符),它對(duì)目標(biāo)內(nèi)存塊來說,無疑太大了,而目標(biāo)內(nèi)存塊聲明在堆棧上;當(dāng)此代碼執(zhí)行時(shí),將會(huì)破壞掉原有堆棧,程序會(huì)因?yàn)橐粋€(gè)訪問違例而崩潰。如果此源內(nèi)存塊由外部第三方提供,那么就有可能存在一個(gè)漏洞,因?yàn)樗试S傳入函數(shù)的內(nèi)存塊以一種特定的方式修改堆棧。
  當(dāng)在C/C++中調(diào)用一個(gè)函數(shù)時(shí),調(diào)用函數(shù)的返回地址被存放在堆棧中,因此在被調(diào)用函數(shù)執(zhí)行完畢時(shí),執(zhí)行流程能重新返回到原處。如果調(diào)用了一個(gè)可能包含潛在緩沖區(qū)溢出的函數(shù),返回地址可能會(huì)被修改,而且執(zhí)行流程將會(huì)跳到緩沖區(qū)數(shù)據(jù)中指定的地方。通過改變函數(shù)的返回地址,攻擊者可獲取進(jìn)程中任意位置的代碼以執(zhí)行,一般而言,主要可以兩種方式被利用:
  ·如果帶有漏洞的程序是已知、且容易訪問到的,攻擊者可查找某函數(shù)的地址,這通常會(huì)在所有進(jìn)程實(shí)例的一處固定地址處被找到;并修改堆棧,等著此函數(shù)被調(diào)用。
  ·要執(zhí)行的指令可作為緩沖區(qū)的一部分傳遞到進(jìn)程地址空間,攻擊者利用此來完成攻擊。
防范緩沖區(qū)溢出
  防范緩沖區(qū)溢出最簡單的方式是限制復(fù)制的數(shù)據(jù)大小,使其不能大于目標(biāo)緩沖區(qū)容量。雖然此方法看上去微不足道,但實(shí)際上,經(jīng)驗(yàn)證明,要在那些大型的C/C++代碼中,完全消除了緩沖區(qū)溢出的隱患,是件非常艱巨的任務(wù)。另外,使用如 .NET或Java這樣的受托管技術(shù),也能極大地降低緩沖區(qū)溢出的危險(xiǎn),但把大型項(xiàng)目移植到此技術(shù)上,實(shí)施起來不太可能也不適當(dāng)。
  基于堆棧的緩沖區(qū)溢出可如此簡單地被利用的原因在于,編譯器生成的指令,會(huì)把函數(shù)的返回地址存儲(chǔ)在堆棧中,但要認(rèn)識(shí)到,編譯器在這個(gè)問題中,只扮演了一個(gè)小小的角色。從Visual C++.NET(7.0)開始,Visual C++開發(fā)小組采取了一種方法,可從編譯器方面減少此類問題發(fā)生的機(jī)率,他們?cè)诙褩V斜4婧瘮?shù)返回地址的數(shù)據(jù)之下,插入了一個(gè)帶有已知數(shù)值的cookie,由此,如果緩沖區(qū)溢出改變了函數(shù)的返回地址值,同樣也會(huì)覆蓋這個(gè)cookie,而在函數(shù)返回時(shí),一般會(huì)對(duì)這個(gè)cookie進(jìn)行檢測(cè),如果檢測(cè)到cookie已被修改,就會(huì)拋出一個(gè)安全異常,而如果這個(gè)異常未被處理,此進(jìn)程就會(huì)終止。以下的代碼演示了一個(gè)帶有安全異常處理方法的簡單程序:
void _cdecl sec_handler( int code, void *)
{
 if ( code == _SECERR_BUFFER_OVERRUN )
 {
  printf("檢測(cè)到一個(gè)緩沖區(qū)溢出。 ");
  exit(1);
 }
}
int main()
{
 _set_security_error_handler( sec_handler );
 //主程序代碼在此省略。
}
  Visual C++.NET 2003(7.1)通過移動(dòng)易受攻擊的數(shù)據(jù)結(jié)構(gòu)--(如異常處理方法的地址)--到堆棧中位于緩沖區(qū)之下的某個(gè)位置,增強(qiáng)了緩沖區(qū)溢出的保護(hù)力度。在編譯器的7.0版本中,可通過破壞緩沖區(qū)與cookie之間的敏感數(shù)據(jù),繞過安全cookie所提供的保護(hù);然而,在新版本的編譯器中,已把這些數(shù)據(jù)移到位于緩沖區(qū)下的一個(gè)區(qū)域,現(xiàn)在,想要通過修改這些數(shù)據(jù)而達(dá)到溢出,似乎是不太可能了。
  圖1演示了在C++編譯器6、7.0、7.1中,堆棧概念上的布局,并演示了堆棧由高地址向低地址空間方向增長,這也是當(dāng)程序執(zhí)行時(shí),堆棧增長的方向。堆棧向下增長,正是導(dǎo)致緩沖區(qū)溢出的主要原因,因?yàn)橐绯鰰?huì)覆寫在比緩沖區(qū)更高的內(nèi)存地址空間上,而此正是易受攻擊數(shù)據(jù)結(jié)構(gòu)的棲身之地。
 
圖1:堆棧邏輯布局
  除了把異常處理方法等信息移到堆棧中數(shù)據(jù)緩沖區(qū)之下,Visual C++.NET 2003的鏈接器也把結(jié)構(gòu)化異常處理方法的地址放到可執(zhí)行文件的頭部中。當(dāng)異常發(fā)生時(shí),操作系統(tǒng)可以檢查堆棧中的異常信息地址,是否符合記錄在文件頭信息中的異常處理方法,如果情況不符,異常處理方法將不會(huì)執(zhí)行。比如說,Windows Server 2003就可檢查結(jié)構(gòu)化異常信息,而此項(xiàng)技術(shù)也在Service Pack 2中移植到了Windows XP上。
  而Visual C++ 2005(8.0)在此基礎(chǔ)上又更進(jìn)了一步,通常當(dāng)有函數(shù)調(diào)用發(fā)生時(shí),如果其中的一個(gè)本地緩沖區(qū)超出限度了,攻擊者可能改寫堆棧中在此之上的任何東西,包括異常處理、安全cookie、幀指針、返回地址和函數(shù)參數(shù)。而這些值的大多數(shù)被不同的機(jī)制所保護(hù)(如安全異常處理),但對(duì)一個(gè)有函數(shù)指針作參數(shù)的函數(shù)來說,仍有機(jī)會(huì)被溢出。如果一個(gè)函數(shù)接受一個(gè)函數(shù)指針(或結(jié)構(gòu)、類中包含有函數(shù)指針)作為參數(shù),攻擊者就有可能改寫指針中的值,使代碼執(zhí)行任何他想要的函數(shù)。鑒于此,Visual C++ 2005編譯器將分析所有可能存在此漏洞的函數(shù)參數(shù),并復(fù)制一份函數(shù)參數(shù)--并不使用原有的函數(shù)參數(shù),把它放在堆棧中本地變量之下。如果原有函數(shù)參數(shù)被溢出改寫了,只要副本中的值仍保持不變,整個(gè)函數(shù)就不會(huì)被攻破。
應(yīng)用緩沖區(qū)保護(hù)
  只需簡單地打開/GS編譯器開關(guān),就可啟用緩沖區(qū)保護(hù)。在Visual Studio中,此開關(guān)可在"C/C++"選項(xiàng)頁的"代碼生成"選項(xiàng)中找到(如圖2所示)。默認(rèn)情況下,在Debug配置下為關(guān),而在Release配置下為開。
 
圖2:設(shè)置/GS開關(guān)
  如果用最新版本的編譯器進(jìn)行編譯,并生成結(jié)構(gòu)化異常信息,那么在默認(rèn)情況下,安全結(jié)構(gòu)化異常處理將是打開的,另外,也可以使用/SAFESEH:NO命令行選項(xiàng)來關(guān)閉安全結(jié)構(gòu)化異常處理,在Visual Studio的工程設(shè)置中,是沒辦法關(guān)閉安全結(jié)構(gòu)化異常處理的,但仍可在鏈接器中使用此命令行選項(xiàng)來完成。
  /GS及更遠(yuǎn)的安全前景
  僅僅是打開一個(gè)編譯器開關(guān),不會(huì)使一個(gè)程序徹底變得安全,但在安全漏洞以各種形式出現(xiàn)的今天,它將有助于使程序更加安全?;诙褩5木彌_區(qū)溢出是安全漏洞中的一大類,但隨著黑客攻擊技術(shù)的不斷更新,相信它的謝幕,還有一段很長的路要走。
  在Microsoft正式的術(shù)語中,/GS和SAGESEH均為軟件強(qiáng)制的數(shù)據(jù)執(zhí)行保護(hù)(DEP),軟件強(qiáng)制的DEP也能以硬件的方式實(shí)現(xiàn),如在實(shí)現(xiàn)了此功能的CPU中,如果數(shù)據(jù)出現(xiàn)在被標(biāo)記為"不可執(zhí)行"的內(nèi)存頁中,將不會(huì)執(zhí)行它。Windows XP SP2及Windows Server 2003現(xiàn)在已支持這些技術(shù),目前市面上的大多數(shù)的32位CPU及全部的64位CPU,都支持No Execute(NX)這類安全增強(qiáng)技術(shù)。
  任何一個(gè)好的安全系統(tǒng),均有多層防范措施應(yīng)對(duì)安全威脅。本文所涉及的編譯器開關(guān),它能防范或減少普通編碼錯(cuò)誤所帶來的安全隱患,而且它具有易于使用和低成本的特點(diǎn),在這場沒有硝煙的戰(zhàn)爭中,不失為一個(gè)好的解決方案,絕對(duì)值得你的程序采用。
本篇文章來源于:開發(fā)學(xué)院 http://edu.codepub.com   原文鏈接:http://edu.codepub.com/2008/1217/190.php
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
緩沖區(qū)溢出
開始進(jìn)行 64位 Windows 系統(tǒng)編程之前需要了解的所有信息
如何特意制造棧緩沖區(qū)溢出?(x86 & ARM)
【轉(zhuǎn)載】MIPS匯編指令
[轉(zhuǎn)]初識(shí)Visual Leak Detector
匯編語言代碼重定位
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服