大香蕉综合在线观看视频-日本在线观看免费福利-欧美激情一级欧美精品性-综合激情丁香久久狠狠

好房網

網站首頁 科技 > 正文

堆棧溢出一般是由什么原因導致的(什么是棧溢出和堆溢出)

2022-07-28 02:37:39 科技 來源:
導讀 想必現(xiàn)在有很多小伙伴對于什么是棧溢出和堆溢出方面的知識都比較想要了解,那么今天小好小編就為大家收集了一些關于什么是棧溢出和堆溢出

想必現(xiàn)在有很多小伙伴對于什么是棧溢出和堆溢出方面的知識都比較想要了解,那么今天小好小編就為大家收集了一些關于什么是棧溢出和堆溢出方面的知識分享給大家,希望大家會喜歡哦。

1、棧溢出是由于C語言系列沒有內置檢查機制來確保復制到緩沖區(qū)的數(shù)據(jù)不得大于緩沖區(qū)的大小,因此當這個數(shù)據(jù)足夠大的時候,將會溢出緩沖區(qū)的范圍。

2、堆溢出的產生是由于過多的函數(shù)調用,導致調用堆棧無法容納這些調用的返回地址,一般在遞歸中產生。堆溢出很可能由無限遞歸(Infinite recursion)產生,但也可能僅僅是過多的堆棧層級。

3、int f(int x)

4、芝有士回答,版權必員究,未經動許可,不能得許轉載

5、{

6、時電里機形,組務示步按。

7、int a[10];

8、a[11] = x;

9、是我多高意直打斗信音克卻滿。

10、}

11、這個就是棧溢出,x被寫到了不應該寫的地方。在特定編譯模式下,這個x的內容就會覆蓋f原來的返回地址。也就是原本應該返回到調用位置的f函數(shù),返回到了x指向的位置。一般情況下程序會就此崩潰。但是如果x被有意指向一段惡意代碼,這段惡意代碼就會被執(zhí)行。

12、堆溢出相對比較復雜,因為各種環(huán)境堆的實現(xiàn)都不完全相同。但是程序管理堆必須有額外的數(shù)據(jù)來標記堆的各種信息。堆內存如果發(fā)生上面那樣的賦值的話就有可能破壞堆的邏輯結構。進而修改原本無法訪問的數(shù)據(jù)。

13、int f(char *s, int n)

14、{

15、char a[10];

16、memcpy(a, s, n);

17、...

18、這個是棧溢出比較真實一點的例子,如果傳入的數(shù)據(jù)長度大于10就會造成溢出,進而改變f的返回地址。只要事先在特定地址寫入惡意代碼,代碼就會被執(zhí)行。

本文到此結束,希望對大家有所幫助。


版權說明: 本文由用戶上傳,如有侵權請聯(lián)系刪除!


標簽: