什么情況下會棧溢出 什么是“棧溢出”和“堆溢出”?
什么是“棧溢出”和“堆溢出”?堆棧溢出是由于C語言系列沒有內(nèi)置的檢查機(jī)制,以確保復(fù)制到緩沖區(qū)的數(shù)據(jù)不能大于緩沖區(qū)的大小,因此當(dāng)數(shù)據(jù)足夠大時,它會溢出緩沖區(qū)的范圍。堆溢出是由太多的函數(shù)調(diào)用引起的,這使得
什么是“棧溢出”和“堆溢出”?
堆棧溢出是由于C語言系列沒有內(nèi)置的檢查機(jī)制,以確保復(fù)制到緩沖區(qū)的數(shù)據(jù)不能大于緩沖區(qū)的大小,因此當(dāng)數(shù)據(jù)足夠大時,它會溢出緩沖區(qū)的范圍。堆溢出是由太多的函數(shù)調(diào)用引起的,這使得調(diào)用堆棧無法保存這些調(diào)用的返回地址。堆溢出可能是由無限遞歸引起的,但也可能是堆棧級別太多。堆溢出比較復(fù)雜,因為各種環(huán)境堆的實現(xiàn)并不完全相同。但是,程序管理堆必須有額外的數(shù)據(jù)來標(biāo)記各種堆信息。如果堆內(nèi)存按上述方式分配,可能會破壞堆的邏輯結(jié)構(gòu)。然后修改無法訪問的數(shù)據(jù)。Int f(char*s,Int n){char a[10]memcpy(a,s,n)。。。這是一個更真實的堆棧溢出示例。如果傳入數(shù)據(jù)的長度大于10,則會導(dǎo)致溢出并更改F的返回地址。只要預(yù)先將惡意代碼寫入特定的地址,就會執(zhí)行該代碼。
什么是棧溢出和堆溢出?
所謂的溢出在廣義上是超出范圍的,整數(shù)有溢出。例如,從0到2550-1的8字節(jié)無符號整數(shù)是下溢的,而2551是上溢的。這是堆棧溢出。X寫在不該寫的地方。在特定的編譯模式下,這個x的內(nèi)容將覆蓋F的原始返回地址。也就是說,應(yīng)該返回到調(diào)用位置的F函數(shù)將返回到x所指的位置。通常,程序?qū)⒈罎?。但是如果x被故意指向一段惡意代碼,那么惡意代碼就會被執(zhí)行。堆溢出比較復(fù)雜,因為各種環(huán)境堆的實現(xiàn)并不完全相同。但是,程序管理堆必須有額外的數(shù)據(jù)來標(biāo)記各種堆信息。如果堆內(nèi)存按上述方式分配,可能會破壞堆的邏輯結(jié)構(gòu)。然后修改無法訪問的數(shù)據(jù)。INTF(char*s,INTN){Chara[10]memcpy(a,s,n)…}這是一個更真實的堆棧溢出示例。如果傳入數(shù)據(jù)的長度大于10,則會導(dǎo)致溢出并更改F的返回地址。只要預(yù)先將惡意代碼寫入特定的地址,就會執(zhí)行該代碼。堆溢出執(zhí)行惡意代碼的一種情況是通過過長的數(shù)據(jù)破壞堆結(jié)構(gòu),使下一個應(yīng)用程序可以保存某些特定函數(shù)指針的位置,然后對其進(jìn)行修改。堆棧和堆溢出的一個共同特點是,第三方完全可以依靠提供特定的數(shù)據(jù)來實現(xiàn)代碼級入侵。如果你玩這個游戲,你可能知道PSP3000的破解。當(dāng)PSP系統(tǒng)顯示TIFF文件時,您使用的是溢出漏洞。TIFF文件包含一段入侵代碼。加載TIFF文件時,也會加載這段代碼,但此時不可能每次運行都執(zhí)行。但是TIFF中的部分?jǐn)?shù)據(jù)非常長,并且非常長的部分包含入侵代碼的位置。當(dāng)系統(tǒng)讀取這部分?jǐn)?shù)據(jù)時,將執(zhí)行入侵代碼。