新聞中心
深入探析Linux棧溢出攻擊的本質(zhì)原理

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出衡南免費(fèi)做網(wǎng)站回饋大家。
在計(jì)算機(jī)科學(xué)領(lǐng)域中,存在許多安全漏洞,其中棧溢出攻擊是一種常見(jiàn)的攻擊手段。Linux操作系統(tǒng)作為開(kāi)源操作系統(tǒng),在使用過(guò)程中,棧溢出攻擊也廣泛出現(xiàn)。因此,深入了解Linux棧溢出攻擊的本質(zhì)原理是非常重要的。
一、棧的定義
在計(jì)算機(jī)系統(tǒng)中,棧指的是一種數(shù)據(jù)結(jié)構(gòu),是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。棧是在代碼執(zhí)行期間自動(dòng)創(chuàng)建的,其位置在內(nèi)存中的棧段。每當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),就會(huì)創(chuàng)造出一個(gè)棧幀(stack frame),每個(gè)棧幀包含了被調(diào)用函數(shù)的參數(shù)、局部變量和返回值,當(dāng)函數(shù)調(diào)用完成后,則會(huì)彈出這個(gè)棧幀,將控制權(quán)交給調(diào)用者。
二、棧溢出攻擊原理
棧在設(shè)計(jì)上的問(wèn)題導(dǎo)致了棧溢出攻擊。棧上的緩沖區(qū)通常被用來(lái)臨時(shí)存儲(chǔ)數(shù)據(jù),比如函數(shù)調(diào)用的參數(shù)和局部變量。但是,這些緩沖區(qū)并沒(méi)有被設(shè)計(jì)成可以防止攻擊的,因此,當(dāng)只有少量的數(shù)據(jù)被存儲(chǔ)在棧緩沖區(qū)時(shí),攻擊者可以通過(guò)輸入超過(guò)棧緩沖區(qū)大小的數(shù)據(jù)來(lái)覆蓋其他關(guān)鍵數(shù)據(jù),從而實(shí)現(xiàn)對(duì)系統(tǒng)的控制。
攻擊者可以通過(guò)精心構(gòu)造的輸入,將輸入的多余數(shù)據(jù)覆蓋其他重要數(shù)據(jù),比如函數(shù)返回地址、指針、函數(shù)參數(shù)等,并將一個(gè)帶有惡意代碼的函數(shù)指針?lè)诺竭@個(gè)位置上。當(dāng)函數(shù)返回時(shí),程序會(huì)按照惡意代碼指針的地址去執(zhí)行,這樣攻擊者就可以獲得系統(tǒng)的控制權(quán)。
三、棧溢出攻擊的分類
棧溢出攻擊的分類主要有以下幾種:
1、緩沖區(qū)溢出攻擊
緩沖區(qū)溢出攻擊是指,攻擊者向程序輸入超過(guò)其處理能力的數(shù)據(jù),以此覆蓋棧上的重要數(shù)據(jù),從而控制系統(tǒng)。
2、棧臟字攻擊
棧臟字攻擊是針對(duì)某些系統(tǒng),在函數(shù)棧幀出棧時(shí)沒(méi)有清除已經(jīng)使用過(guò)的棧數(shù)據(jù),在下次使用的時(shí)候被當(dāng)成有效數(shù)據(jù)而被濫用的攻擊方法。
3、格式化字符串攻擊
格式化字符串攻擊(format string attack),是指攻擊者通過(guò)格式化字符串漏洞,以某種方式將代碼注入受害者機(jī)器,然后執(zhí)行所注入的代碼。
四、防范措施
要防止棧溢出攻擊,可以采取以下措施:
1、數(shù)據(jù)的驗(yàn)證
一般來(lái)講,對(duì)數(shù)據(jù)的驗(yàn)證是防止棧溢出攻擊的有效手段,程序需要對(duì)數(shù)據(jù)輸入進(jìn)行合法性驗(yàn)證,例如根據(jù)輸入類型,限制輸入長(zhǎng)度等方法,并將數(shù)據(jù)范圍限制在程序預(yù)處理時(shí)指定的范圍內(nèi)。
2、堆棧隨機(jī)化
堆棧隨機(jī)化技術(shù)是指在系統(tǒng)加載執(zhí)行過(guò)程中,將棧地址隨機(jī)化。這樣攻擊很難估計(jì)哪里是正常位置,自然難以知道往哪里覆蓋數(shù)據(jù),有效預(yù)防了棧溢出攻擊。
3、地址隨機(jī)布局
地址隨機(jī)布局技術(shù)(ASLR,Address Space Layout Randomization)是一種通過(guò)將系統(tǒng)內(nèi)存地址的分配隨機(jī)化來(lái)增加安全性的技術(shù)。ASLR技術(shù)可以隨機(jī)化程序在內(nèi)存中的分布,使得攻擊者難以選擇正確的地址進(jìn)行攻擊,從而阻止攻擊者對(duì)棧進(jìn)行操作。
4、使用高級(jí)編程語(yǔ)言
高級(jí)編程語(yǔ)言的使用可以有效地避免一些棧溢出漏洞的產(chǎn)生。高級(jí)編程語(yǔ)言的編譯器普遍采用了堆棧保護(hù)技術(shù),例如緩沖區(qū)溢出發(fā)現(xiàn)檢測(cè)、內(nèi)存安全檢查、代碼注入檢測(cè)等,這可以減少棧溢出攻擊的風(fēng)險(xiǎn)。
五、結(jié)論
深入了解Linux棧溢出攻擊的本質(zhì)原理,可以幫助我們更好地了解其工作原理以及如何有效地進(jìn)行防范。要防止棧溢出攻擊,可以采用多種措施,包括數(shù)據(jù)的驗(yàn)證、堆棧隨機(jī)化、地址隨機(jī)布局以及使用高級(jí)編程語(yǔ)言等。但需要注意的是,安全永遠(yuǎn)不是一成不變的,需要持續(xù)保持對(duì)安全漏洞的覺(jué)察,及時(shí)采取有效的措施,為系統(tǒng)的安全保駕護(hù)航。
相關(guān)問(wèn)題拓展閱讀:
- 內(nèi)核棧溢出
內(nèi)核棧溢出
報(bào)地址錯(cuò)誤應(yīng)該與指針使用稿廳不正常有關(guān)系
一是使用野指針
二是重復(fù)釋放已釋放過(guò)的指針
三是數(shù)據(jù)溢出、越界(尤其檢查字符數(shù)組,即字符串?dāng)?shù)據(jù)差枯的變化)
加一些調(diào)試語(yǔ)句,或采用-g編譯 通虛敬洞過(guò)gdb等方法 來(lái)觀察、跟蹤一下運(yùn)行程序吧。
你沒(méi)有釋放內(nèi)存 最終造成內(nèi)存出錯(cuò)
您好,很高興為您解答。
1.進(jìn)程的堆棧
內(nèi)核在創(chuàng)建進(jìn)程的時(shí)候,在創(chuàng)建task_struct的同事,會(huì)為進(jìn)程創(chuàng)建相應(yīng)的堆棧。每個(gè)進(jìn)程會(huì)有兩個(gè)棧,一個(gè)用戶棧,存在于用戶空間,一個(gè)內(nèi)核棧,存在于內(nèi)核空間。當(dāng)進(jìn)程在用戶空間運(yùn)行時(shí),cpu堆棧指針寄存器里面的內(nèi)容是用戶堆棧地址,使用用戶棧;當(dāng)進(jìn)程在內(nèi)核空間時(shí),cpu堆棧指針寄存器里面的內(nèi)容是內(nèi)核棧空間地址,使用內(nèi)核棧。
2.進(jìn)程用戶棧和內(nèi)核棧的切換
當(dāng)進(jìn)程因?yàn)橹袛嗷蛘呦到y(tǒng)調(diào)用而陷入內(nèi)核態(tài)之行時(shí),進(jìn)程所使用的堆棧也要從用戶棧轉(zhuǎn)到內(nèi)核棧。
進(jìn)程陷入內(nèi)核態(tài)后,先把用戶態(tài)堆棧的地址保存在內(nèi)核棧之中,然后設(shè)置堆棧指針寄存器的內(nèi)容為內(nèi)核棧的地址,這樣就完成了用戶棧向內(nèi)核棧的轉(zhuǎn)換;當(dāng)進(jìn)程從內(nèi)核態(tài)恢復(fù)到用戶態(tài)之行時(shí),在內(nèi)核態(tài)之行的最后將保存在內(nèi)核棧里面鏈察的用戶棧的地址恢復(fù)到堆棧指針寄存器即可。這樣就實(shí)現(xiàn)了內(nèi)核棧和用戶棧的互轉(zhuǎn)。
那么,我們知道從內(nèi)核轉(zhuǎn)到用戶態(tài)時(shí)用戶棧的地址是在陷入內(nèi)核的時(shí)候保存在內(nèi)核棧里面的,但是在陷入內(nèi)核的時(shí)候,我們是如何知道內(nèi)核棧的地址的呢?
關(guān)鍵在進(jìn)程從用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài)的時(shí)候,進(jìn)程的內(nèi)核??偸强盏?。這是因?yàn)?,?dāng)棚爛茄進(jìn)程在用戶態(tài)運(yùn)行時(shí),使用的是用戶棧,當(dāng)進(jìn)程陷入到內(nèi)核態(tài)時(shí),內(nèi)核棧保存進(jìn)程在內(nèi)核態(tài)運(yùn)行的相關(guān)信心,但是一旦進(jìn)程返回到用戶態(tài)后,內(nèi)核棧中保存的信息無(wú)效,會(huì)全部恢復(fù),因此每次進(jìn)程從用戶態(tài)陷入內(nèi)核的時(shí)候得到的內(nèi)核棧都是空的。所以在進(jìn)程陷入內(nèi)核的時(shí)候,直接把內(nèi)核棧的棧頂?shù)刂方o堆棧指針寄存器就可以了。
3.內(nèi)核棧的實(shí)現(xiàn)
內(nèi)核棧在kernel-2.4和kernel-2.6里面的實(shí)現(xiàn)方式是不一樣的。
在kernel-2.4內(nèi)核里面,內(nèi)核棧的實(shí)現(xiàn)是:
union task_union {
struct task_struct task;
unsigned long stack;
}; 其中,init_stack_size的大小只能是8k。
內(nèi)核為每個(gè)進(jìn)程分配task_struct結(jié)構(gòu)體的時(shí)候,實(shí)際上分配兩個(gè)連續(xù)的物理頁(yè)面,底部用作task_struct結(jié)構(gòu)體,結(jié)構(gòu)上面的用作堆棧。使用current()宏能夠訪問(wèn)當(dāng)前正在運(yùn)行的進(jìn)程描述符。
注意:這個(gè)時(shí)候task_struct結(jié)構(gòu)是在內(nèi)核棧里面的,內(nèi)核棧的實(shí)際能用大小大概有7k。
內(nèi)核棧在kernel-2.6里面的實(shí)現(xiàn)是(kernel-2.6.32):
union thread_union {
struct thread_info thread_info;
unsigned long stack;
}; 其中thread_size的大小可以是4k,也可以是8k,thread_info占52bytes。
當(dāng)內(nèi)核棧為8k時(shí),thread_info在這塊內(nèi)存的起始地址,內(nèi)核棧從堆棧末端向下增長(zhǎng)。所以此時(shí),kernel-2.6中的current宏歷盯是需要更改的。要通過(guò)thread_info結(jié)構(gòu)體中的task_struct域來(lái)獲得于thread_info相關(guān)聯(lián)的task。更詳細(xì)的參考相應(yīng)的current宏的實(shí)現(xiàn)。
struct thread_info {
struct task_struct *task;
struct exec_domain *exec_domain;
__u32 flags;
__u32 status;
__u32 cpu;
… ..
}; 注意:此時(shí)的task_struct結(jié)構(gòu)體已經(jīng)不在內(nèi)核??臻g里面了。
如若滿意,請(qǐng)點(diǎn)擊右側(cè)【采納答案】,如若還有問(wèn)題,請(qǐng)點(diǎn)擊【追問(wèn)】
希望我的回答對(duì)您有所幫助,望采納!
~
linux棧溢出攻擊原理的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux棧溢出攻擊原理,深入探析linux棧溢出攻擊的本質(zhì)原理,內(nèi)核棧溢出的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享文章:深入探析linux棧溢出攻擊的本質(zhì)原理(linux棧溢出攻擊原理)
當(dāng)前URL:http://www.dlmjj.cn/article/dpicsph.html


咨詢
建站咨詢
