2014-11-05 36 views
7

意思是,這是程序代碼的片段:&是什麼作爲表達式變量在C

char authenticated = 0; 
char guard1 = 234; 
char guard2 = 234; 
//more variables initliased... 
char buf[128]; 

&authenticated; 
&guard1; 
&guard2; 

那麼什麼時候參考站在那裏,作爲程序代碼的單一表達的意思嗎?

編輯:更多的背景:它就是被編譯成一個Debian服務器上gcc和它相關的安全項目,在這裏你可以溢出buf數組中。

+2

也許與[爲什麼用這種方式使用函數參數'foo':*(&foo)?](http://stackoverflow.com/q/25530115/1708801),我認爲沒有足夠的上下文。 – 2014-11-05 20:15:23

+7

'&'是地址運算符。 '&authenticated'是'authenticated'變量的RAM中的地址。陳述'認證'(注意';')是合法的C,但是不做任何事情。 – UncleO 2014-11-05 20:21:57

+3

出於很好的理由,我必須假設它有一個目的。 – amaik 2014-11-05 20:24:48

回答

6

鑑於這是一個安全項目,我的猜測是這些語句旨在防止編譯器優化掉authenticated,guard1guard2變量。如果這些變量稍後未在函數中使用,則兼容的C編譯器可以優化它們,從而更改函數調用的堆棧幀的佈局。

從技術上講,由於這些語句沒有副作用,編譯器原則上也可以優化它們。然而,我得到的意思是,預期的編譯器不會這樣做(不是它不能做到這一點,只是它不能做到這一點)。這樣,堆棧框架的佈局將有authenticated變量屏蔽兩個不是空終止符的值,可能使覆蓋authenticated有點困難。當然,這聽起來像你的任務是專門改變authenticated,所以它不是萬無一失的。 :-)

希望這有助於!

+0

有道理。是的,任務是覆蓋已驗證的。但認證和警衛。 (爲了簡單起見,我還遺漏了隨機的金絲雀)都被用來檢查它們的值是否沒有改變。 – amaik 2014-11-05 20:42:10

+0

在K&R C中,將變量的地址表示爲不能存儲在寄存器中。 ISO C通過as-if規則放寬了這一要求;但編寫代碼的編譯器可能會尊重這種意圖。 – 2014-11-05 21:19:02

+2

但是,我不清楚爲什麼編碼器沒有寫'struct {char guard1; char buf [128]; char guard2; } x;'或類似的 – 2014-11-05 21:19:25

相關問題