新聞中心
現(xiàn)在的網(wǎng)絡(luò)安全領(lǐng)域由各種各樣的門派,最火的莫屬web領(lǐng)域的網(wǎng)絡(luò)安全,還有物聯(lián)網(wǎng)安全等等。緩沖區(qū)溢出安全漏洞有一種忽視的感覺(jué),起始最開(kāi)始的、最有威力的還是緩沖區(qū)溢出漏洞,很多零日漏洞也是基于緩沖區(qū)漏洞的,最具破壞力的也是緩沖區(qū)漏洞。這篇文章簡(jiǎn)單講解一下緩沖區(qū)漏洞的原理知識(shí),后期結(jié)合metasploit和靶機(jī)系統(tǒng),推出實(shí)戰(zhàn)方面的課程。

目前創(chuàng)新互聯(lián)已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站托管運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、海湖新網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
1. 內(nèi)存攻防技術(shù)
很多學(xué)習(xí)網(wǎng)絡(luò)安全的人員有這樣的一種感覺(jué),對(duì)于緩沖區(qū)溢出、棧溢出、堆溢出、shellcode等有一定的了解,模模糊糊的了解術(shù)語(yǔ)和概念,但是如果實(shí)踐編寫一些滲透代碼時(shí),總感覺(jué)無(wú)從下手,也許是沒(méi)有邁過(guò)技術(shù)門檻。
內(nèi)存攻擊指的是利用軟件的安全漏洞,構(gòu)造惡意的輸入導(dǎo)致軟件在處理輸入數(shù)據(jù)是出現(xiàn)非預(yù)期的錯(cuò)誤,導(dǎo)致數(shù)據(jù)被寫到特定的位置,改變了軟件的控制流程,轉(zhuǎn)而執(zhí)行外部輸入的指令,造成目標(biāo)系統(tǒng)被遠(yuǎn)程控制或者拒絕服務(wù)。
內(nèi)存攻擊的3個(gè)重點(diǎn):
- 軟件存在安全漏洞
- 惡意的輸入觸發(fā)安全漏洞
- 改變軟件的控制流程
2. 緩沖區(qū)溢出漏洞機(jī)制
緩沖區(qū)溢出漏洞是由于程序沒(méi)有對(duì)緩沖區(qū)的邊界條件進(jìn)行檢查,導(dǎo)致引發(fā)的異常行為,向緩沖區(qū)寫入數(shù)據(jù),內(nèi)容超過(guò)了程序員設(shè)定的緩沖區(qū)邊界,覆蓋了相鄰的內(nèi)存區(qū)域,覆蓋了其他變量還有可能影響程序的控制流程。
這里舉個(gè)例子,如下圖所示,內(nèi)存中存在兩個(gè)相鄰的變量,A是char[]類型的,用于接收外部的數(shù)據(jù),輸入為8個(gè)字節(jié),B是短整型的,B的初始值是65535(0xffff)。如果用戶輸入的是"abcdefghi",9個(gè)字節(jié),那么B就被修改為0x0069,如下圖所示
根據(jù)緩沖區(qū)位置的不同,可以分為:
- 棧溢出(Stack Overflow)
- 堆溢出(Heap Overflow)
3. 棧溢出漏洞原理
棧是由操作系統(tǒng)創(chuàng)建和維護(hù)的,支持程序內(nèi)的函數(shù)調(diào)用功能。
函數(shù)調(diào)用時(shí),程序會(huì)將返回地址壓入棧中,執(zhí)行換被調(diào)用函數(shù)的代碼后,通過(guò)ret命令從棧中彈出返回地址,放入eip寄存器,繼續(xù)程序的運(yùn)行。
棧溢出的原理:程序向棧中寫入數(shù)據(jù)時(shí),當(dāng)寫入的數(shù)據(jù)長(zhǎng)度超過(guò)棧分配的緩沖區(qū)空間時(shí),就造成了棧溢出。
棧溢出最常見(jiàn)的利用方式有:
- 覆蓋函數(shù)返回地址
- 覆蓋異常處理結(jié)構(gòu)
這里舉個(gè)例子,說(shuō)明覆蓋函數(shù)返回地址的情況,一般發(fā)生在函數(shù)調(diào)用時(shí),程序?qū)⒅鞒绦虻南乱粭l指令地址保存到棧中,子函數(shù)執(zhí)行結(jié)束后,從棧中彈出主程序的指令地址,繼續(xù)執(zhí)行。這樣程序的返回地址、函數(shù)的調(diào)用參數(shù)、局部變量均位于同一個(gè)棧中,就給棧溢出改寫程序流程提供了機(jī)會(huì)??聪旅嬉欢未a
- #include
- void foo(char *bar)
- {
- char c[8];
- strcpy(c,bar);
- }
- int main()
- {
- char array[]='abcdabcdabcd\x18\xff\x18\x00';
- foo(array);
- return 0;
- }
注意上述代碼中的strcpy(c,bar)并沒(méi)有進(jìn)行邊界檢查,這段代碼執(zhí)行結(jié)束前后的堆棧空間的分配情況如下圖所示。源字符串a(chǎn)rray的16個(gè)字符復(fù)制到C中,最后的4個(gè)字符覆蓋了棧的返回地址,改為0x0018ef18,當(dāng)函數(shù)foo返回之后,程序就會(huì)跳轉(zhuǎn)到0x0018ef18這個(gè)地址執(zhí)行相關(guān)指令。
分享文章:網(wǎng)絡(luò)安全基礎(chǔ),緩沖區(qū)溢出漏洞解析
分享路徑:http://fisionsoft.com.cn/article/cogdcds.html


咨詢
建站咨詢
