2012-04-09 75 views
2

我正在讀緩衝區,堆棧和堆溢出。我也讀了這個post。我的問題是這樣的:如果我在代碼中只使用全局變量,我可以說它可以防止所有的溢出攻擊?使用全局變量編寫程序更安全嗎?

讓我們說我有這樣的緩衝,在全球範圍內聲明的代碼:

char buf1[10]; 
char buf2[100]; 

如果我發送buf1作爲緩衝,以recv(int s, char *buf, int len,int flags);

  1. 我將覆蓋數據段,可能破壞buf2的內容吧?
  2. 我能否從中運行代碼,因爲據我所知它不是代碼段,數據段不可執行。

我們可以得出結論:使用Globals是最安全的方法嗎?

+15

最安全的方式是不超過緩衝區_。 – 2012-04-09 17:03:41

+12

國際海事組織,這大致相當於當你25歲時自殺,以確保當你變老時不致死於癌症。 – 2012-04-09 17:05:00

+0

只要你爲'len'傳遞正確的值,你就不會溢出你的緩衝區。 *這不是一個困難的概念*。 – 2012-04-09 17:10:41

回答

2

這與你的數據在哪裏無關。如果你足夠努力,你可以寫在外面。是否可以使用任何堆棧緩衝區溢出來覆蓋返回地址並使緩衝區中的代碼執行,這取決於體系結構。恕我直言,堆棧段中的數據不應該是可執行的,並且試圖執行它應該導致內存管理中斷。

使用'全局變量'而不是堆棧變量對於除了微不足道的應用程序之外的其他任何東西都不是一種理智的解決方案。

我只將數據加載到緩衝區類中的動態分配緩衝區中,所以堆棧緩衝區溢出在我的應用程序中從來不是問題(此外,我只是不會超出緩衝區!)。

7

不,完全沒有。儘管難以直接修改堆棧中的返回地址等,但仍有可能破壞或惡意攻擊此類程序(如果緩衝區溢出不慎)。

3

我可以說它可以防止溢出的所有漏洞?

不,全局變量可能會溢出。

如果我們說我把它作爲緩衝區發送給recv(int s,char * buf,int len,int flags);我將覆蓋數據段並可能會破壞buf2內容,但我無法從中運行代碼。我對嗎?使用Globals是最安全的方式?

不,變量的存儲時間對它是否可以溢出沒有影響。

3

避免緩衝區溢出的最好方法是避免使用靜態緩衝區,並使用像STL,boost等庫來處理任何需要memeory分配的對象,例如使用數組中的STL向量。

2

存在緩衝區溢出漏洞,因爲堆棧上的緩衝區與堆棧中較遠的返回地址位於同一位置。最終該函數必須返回,並使用該地址繼續執行。通過故意覆蓋一個緩衝區,可以存儲不同的返回地址,也許是由開發者存放的代碼。

當然使用全局緩衝區減少了這種特定類型的攻擊的機會。但是,它不會減少由於破壞當前操作範圍之外的數據而導致應用程序失敗的可能性。

全球數據也有其不足之處,它不是一個全面的解決方案。所以最好的方法是設計你的代碼,防止緩衝區溢出,不管緩衝區的位置如何。

C和C++都提供了緩衝區功能的安全版本,這些應該與良好的設計一起使用,作爲防範安全漏洞的主要措施。