2011-12-18 101 views
2

我們正在研究使用金絲雀避免緩衝區溢出。爲什麼金絲雀對結構沒有幫助?

有一個問題是:

爲什麼在這個結構中不是有用的金絲雀?

struct test { 
char arra[64]; 
int myVar; 
} 

我被卡住了。任何線索?

Pd。這是作業

回答

2

我相信你的教授意味着它不會保護(肯定)從結構內的陣列的溢出。編譯器將該Canary值放置在您的結構和堆棧的結尾之間。如果你的數組溢出的數量少於int字節,溢出會破壞你的結構的int元素,而不是canary的值(這是因爲編譯器選擇的結構佈局不準確)。所以在這種情況下,溢出不會被發現並且可以被利用。

0

你在說關於stack canaries。直到現在我還沒有聽說過這個詞。據我所知,你會把int myVar放在char數組之前,但在WikiPedia的例子中,它是一個浮點數。

爲什麼不打開邊界檢查?儘管程序運行速度較慢,但​​是在C編譯器中的邊界檢查不是嗎?

+0

綁定檢查不能很容易地與C廣泛使用的指針算術調和。你一定在想另一種語言。 – 2011-12-18 14:43:22

1

Canaries應該放置在緩衝區溢出時,第一個被損壞的數據應該是canary,這樣我們才能對canary的值進行驗證檢查,並根據這個值設置溢出警報。但在這種情況下,我可以做這樣的事情,甚至沒有修改金絲雀myVar的價值。

struct test t; 
t.arra[100] = 1; 

More about Canaries

+0

MyVar不是金絲雀。 – gnometorule 2011-12-18 15:01:39