張華
摘要:緩沖區(qū)溢出是一種常見的網(wǎng)絡(luò)安全漏洞,可以對(duì)計(jì)算機(jī)操作系統(tǒng),應(yīng)用軟件造成巨大的威脅。通過緩沖區(qū)溢出攻擊,網(wǎng)絡(luò)黑客可以遠(yuǎn)程執(zhí)行惡意代碼,甚至獲得主機(jī)的控制權(quán),從而開始各種非法操作。該文分析了緩沖區(qū)溢出漏洞的產(chǎn)生原因及其原理,結(jié)合具體代碼介紹了ShellCode的構(gòu)造方法。
關(guān)鍵詞:緩沖區(qū)溢出;網(wǎng)絡(luò)安全;漏洞;ShellCode
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)06-0085-02
Abstract: Buffer overflow is a common network security vulnerability, which can pose a great threat to computer operating system and application software. Through buffer overflow attacks, network hackers can execute malicious code remotely , or even get the control of the host to carry out a variety of illegal operations. This paper analyzes the causes and principles of buffer overflow vulnerability, introduces the construction method of ShellCode with the specific code.
Key words: buffer overflow; network security; vulnerability; ShellCode
1 概述
緩沖區(qū)溢出攻擊并非一種新的攻擊手段。早在1989年,Spafford就做了一個(gè)關(guān)于緩沖區(qū)溢出程序的分析報(bào)告。2003年的“沖擊波”病毒,2004年的“震蕩波”病毒就是利用了緩沖區(qū)溢出的漏洞。然而時(shí)至今日,我們?nèi)匀粫r(shí)時(shí)刻刻感受著來(lái)自緩沖區(qū)溢出漏洞的威脅。圖1所示的是中國(guó)國(guó)家信息安全漏洞庫(kù)在2017年2月份下旬收錄的緩沖區(qū)溢出漏洞。不到十天時(shí)間,現(xiàn)有的計(jì)算機(jī)系統(tǒng)就出現(xiàn)如此多的緩沖區(qū)溢出漏洞。依據(jù)CNVD(中國(guó)信息安全漏洞共享平臺(tái))的統(tǒng)計(jì)數(shù)據(jù),緩沖區(qū)溢出類型的漏洞在各種類型的漏洞比例中,仍然名列前茅。因此深入學(xué)習(xí)探討緩沖區(qū)溢出漏洞是很有必要的。
緩沖區(qū)溢出漏洞原因可以分為棧溢出、堆溢出、文件流溢出、格式化字符串溢出。本文主要介紹棧溢出漏洞的原因、原理,實(shí)施該攻擊手段的一個(gè)核心步驟-ShellCode的編寫。
2 漏洞原因和原理
2.1 產(chǎn)生原因
堆棧溢出漏洞是通過在程序的堆棧里寫入超過其長(zhǎng)度的內(nèi)容,造成堆棧溢出,從而使得程序的堆棧遭到破壞。例如下列程序:
這段程序中buffer數(shù)組只能存放8個(gè)字符,而strcpy()把一個(gè)長(zhǎng)度超過8的字符串復(fù)制到buffer數(shù)組中,就會(huì)造成緩沖區(qū)buffer的溢出。類似這樣的函數(shù)還有strcat(),sprintf(),gets(),scanf(),getchar()等。這些函數(shù)都沒有邊界檢查,因此為緩沖區(qū)溢出攻擊提供了基礎(chǔ)條件。如果開發(fā)人員沒有檢查參數(shù)的長(zhǎng)度就直接復(fù)制到緩沖區(qū)中去,這個(gè)軟件產(chǎn)品就存在著緩沖區(qū)溢出的漏洞,為別有用心的攻擊者創(chuàng)造了有利的條件。
2.2 原理
要深入理解緩沖區(qū)溢出的原理,我們得先從Windows函數(shù)執(zhí)行原理說(shuō)起。調(diào)用一個(gè)函數(shù)時(shí),計(jì)算機(jī)需要執(zhí)行如下步驟:
1)函數(shù)的各個(gè)參數(shù)(假設(shè)有3個(gè)參數(shù),分別是param1,param2,param3)從右到左依次入棧;
2)指令寄存器(EIP)的內(nèi)容作為返回地址入棧;
3)基址寄存器(EBP)的內(nèi)容入棧;
4)把當(dāng)前的ESP的內(nèi)容賦值給EBP,作為新的基地址;
5)為函數(shù)的局部變量分配空間,假設(shè)先后有兩個(gè)int類型的變量var1,var2,則var1,var2變量的地址分別為[EBP-4],[EBP-8];
函數(shù)執(zhí)行完畢時(shí),根據(jù)堆棧原理,出棧順序?yàn)椋壕植孔兞縱ar2,var1,基址寄存器(EBP)的內(nèi)容,指令寄存器(EIP)的內(nèi)容,param1,param2,param3。
根據(jù)本文2.1的程序,局部變量buffer數(shù)組8個(gè)元素的從低到高地址分別為[EBP-32],[EBP-28],…,[EBP-4]。函數(shù)strcpy()把字符串復(fù)制到buffer數(shù)組時(shí),數(shù)組元素操作順序?yàn)閺牡偷刂废蚋叩刂罚绻址L(zhǎng)度超過8個(gè)字符,超過部分的字符串就會(huì)覆蓋了EBP,RET返回地址,從而造成緩沖區(qū)溢出。通過構(gòu)造特殊的字符串,使其覆蓋RET返回地址,從而讓程序執(zhí)行特定程序(ShellCode),這就是堆棧溢出攻擊。
3 構(gòu)造ShellCode
ShellCode實(shí)際上是用機(jī)器語(yǔ)言編寫的一段程序,當(dāng)計(jì)算機(jī)出現(xiàn)緩沖區(qū)溢出時(shí)轉(zhuǎn)而去執(zhí)行的代碼。攻擊者可以通過ShellCode獲得主機(jī)的系統(tǒng)特權(quán),從而進(jìn)行非法操作。ShellCode的編寫是緩沖區(qū)溢出攻擊最關(guān)鍵的步驟。
本文以打開遠(yuǎn)程主機(jī)DOS窗口為例。在VC++6.0中,通過圖3所示這段程序就可以完成此功能。
從匯編(機(jī)器)語(yǔ)言的角度來(lái)說(shuō),上述代碼最關(guān)鍵的是LoadLibrary("msvCRT.dll"),以及System("command.com")這兩個(gè)函數(shù)調(diào)用。要調(diào)用一個(gè)函數(shù),需要知道這個(gè)函數(shù)的內(nèi)存地址,并獲得函數(shù)參數(shù)。對(duì)于函數(shù)內(nèi)存地址問題,我們可以在VC++6.0中按F10進(jìn)入調(diào)試模式,點(diǎn)擊調(diào)試工具欄的“Disassembly”按鈕,在反編譯模式中開啟“Code Bytes”選項(xiàng)。筆者在32位windows7操作系統(tǒng)調(diào)試,得到LoadLibrary(),System()函數(shù)的地址分別為0x7689DE15,0x77B1C976。而函數(shù)參數(shù)問題,我們可以逐個(gè)字符地將參數(shù)字符串入棧,最后再通過匯編指令push esp完成參數(shù)字符串偏移地址入棧操作。調(diào)用System("command.com")函數(shù)的匯編代碼如圖4所示,LoadLibrary("msvCRT.dll")可參考此代碼編寫。
將上述匯編語(yǔ)言程序在VC++6.0中轉(zhuǎn)成機(jī)器語(yǔ)言形式,即為通過緩沖區(qū)溢出漏洞遠(yuǎn)程啟動(dòng)主機(jī)DOS窗口的ShellCode,如圖5所示。
4 結(jié)論
本文詳細(xì)分析了緩沖區(qū)溢出漏洞的原因及原理,并以遠(yuǎn)程啟動(dòng)主機(jī)的DOS窗口為例,指出ShellCode構(gòu)建方法。由于緩沖區(qū)溢出漏洞與軟件開發(fā)過程中的軟件設(shè)計(jì)、編碼規(guī)范、軟件測(cè)試息息相關(guān),因此這種漏洞難以徹底解決,將一直是計(jì)算機(jī)系統(tǒng)安全的重要威脅。因此該問題的研究工作仍然具有實(shí)際意義。
參考文獻(xiàn):
[1] 中國(guó)信息安全漏洞共享平臺(tái).漏洞信息月度通報(bào)2016(12)[EB/OL].http://www.cnvd.org.cn/webinfo/show/4026.
[2] 劉紹翰,許建真,張福炎.基于緩沖溢出漏洞的攻擊及其預(yù)防研究綜述[J].計(jì)算機(jī)應(yīng)用與軟件,2004,21(1):83-86.
[3] 閎劉鑫,張永濤,李鷗.Windows系統(tǒng)下緩存區(qū)溢出攻擊實(shí)現(xiàn)與防范[J].微計(jì)算機(jī)信息,2005(26): 3-12.
[4] 石志國(guó),薛為民,江俐.計(jì)算機(jī)網(wǎng)絡(luò)安全教程[M].北京:清華大學(xué)出版社,北京交通大學(xué)出版社,2004.
[5] 沈美明,溫冬嬋.IBM—PC匯編語(yǔ)言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,1998.
[6] 魯珂,趙繼東.計(jì)算機(jī)信息系統(tǒng)安全實(shí)驗(yàn)教程[M].成都:電子科技大學(xué)出版社,2007