2016-01-11 34 views
5

我想創建一個只需要一個隨機數的程序,所以我嘗試在主函數中使用argc的地址作爲隨機源,因爲我認爲程序在內存中的位置是隨機的,並且它可以節省一些包含語句,所以我嘗試:我可以在main中使用argc的地址作爲隨機源嗎?

#include <stdio.h> 
int main(int argc,const char* argv[]){ 
    printf("%lu\n",(unsigned long int)&argv/sizeof(unsigned long int)); 
    return 0; 
} 

,但我發現,每次在輸出是不是很「亂」:他們是4的倍數:

17591828907268 
17591841542404 
17591845040388 
17591834556676 

的原因是什麼?並且使用argc的地址作爲隨機數可能?

然後我嘗試刪除地址的一些位:

#include <stdio.h> 
int main(int argc,const char* argv[]){ 
    printf("%lu\n",(unsigned long int)&argv >> 12); 
    return 0; 
} 

它看起來相當隨機的這段時間,至少它既有單雙號:

34359070631 
34359034616 
34359078055 
34359080624 

是「正確的」把argc的地址變成隨機數的方法?

+0

有些信息你問'&argc'是一個很好的種子使用'srand()函數'? –

+0

程序在內存中的位置不可能是隨機的。操作系統使用一種算法來確定程序在內存中的位置,該算法反映了操作系統選擇的一些策略。 – Dko

+0

真的沒有「一個隨機數」這樣的東西。有隨機的數字序列。如果程序的每次運行只需要一個數字,則必須從程序外部生成的序列中選擇它。 John Hascall對/ dev/random的建議是一個很好的選擇。像random.com是另一回事。 –

回答

3

是什麼原因?

Alignment requirements爲你的架構,我以爲是x86和int爲4個字節,這意味着每個int應該調整到被4整除(這正是你所看到的行爲)的地址。

並使用argc的地址作爲隨機數可能嗎?

可能嗎? Yeah, sure。你只要繼續做下去。

這是一個好主意嗎?不,絕對不是。請參閱下面的原因。

這是「正確」的方式將argc的地址變成隨機數嗎?

我假設「正確」你的意思是一個很好的熵來源,答案是否定的。

在現代操作系統中有一定程度的address space layout randomization,但它並不意味着是一個很好的熵來源。這只是爲了讓別人更難以使用程序中的錯誤作爲安全漏洞。而且真的沒有ASLR的任何保證(如果你真的想要的話,你可以在一些操作系統中關閉它)。

總之,你不應該使用變量的地址作爲熵的來源。這不是一個隨機性的好來源。

0

它是4的倍數,因爲函數地址將在我知道的每個平臺上進行字對齊(我認爲這是x86或x86_64?)

argc的地址對於某些詞的意義可能是「隨機的」,因爲你可能不會知道它是什麼,所以如果你使用它來播種遊戲的開始條件或任何這可能會奏效;絕對不要依賴它,如果你使用這個加密或任何東西 - 攻擊者可以做的事情來影響argc加載的地方。也就是說,你的C庫帶有完美可用的rand()和srand()函數,作爲一種獎勵,你可以刻意爲它設置一個特定的值,這對調試非常有用;我個人堅持使用隨機數字。

相關問題