2016-01-11 7 views
5

私はランダムな数だけ必要なプログラムを作成したいので、メモリ内のプログラムの場所がランダムであり、いくつかのものを保存できると思いますので、main関数のargcのアドレスをランダムなソースとして使用しようとしますメインで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

いくつかの情報は、あなたが求めていますか? –

+0

メモリ内のプログラムの場所はランダムではありません。 OSはアルゴリズムを使用してメモリ内のどこにプログラムが配置されているかを決定し、そのアルゴリズムはOSによって選択された戦略を反映します。 – Dko

+0

実際には「1つの乱数」はありません。ランダムな数列があります。プログラムの実行ごとに1つの番号だけが必要な場合は、プログラムの外で生成されたシーケンスから選択する必要があります。 John Hascallの/ dev/randomの提案は優れた選択です。 random.comのようなものが別のものです。 –

答えて

3

何故ですか?私はx86とintであると仮定し

あなたのアーキテクチャ用

Alignment requirementsは、各intは(正確にあなたが見ている動作です)4で割り切れるアドレスに整列されなければならないことを意味する、4バイトです。

そして、乱数としてargcのアドレスを使用していますか?

可能ですか? Yeah, sure。あなたは前進してそれをやります。

いいですか?いいえ、間違いなく。理由は以下を参照してください。

argcのアドレスを乱数にするのは「正しい」方法ですか?

「正しい」とは、良いエントロピー源を意味し、その答えはいいえです。

最近のオペレーティングシステムではある程度度合いがありますが、それはエントロピーの良いソースではありません。これは、誰かがあなたのプログラムのバグをセキュリティの悪用として使用することをより困難にすることを意味しています。実際にASLRについては何の保証もありません(もしあなたが本当にしたいのであれば、いくつかのオペレーティングシステムではそれをオフにすることができます)。

つまり、エントロピーのソースとして変数のアドレスを使用しないでください。ランダム性の良い源ではありません。

0

関数のアドレスは、私が知っているすべてのプラットフォーム(つまり、これはx86またはx86_64と仮定していますか?)

argcのアドレスは、あなたがおそらくそれが何であるかを知ることができないという点で、ある意味では「ランダム」である可能性があります。したがって、これを使用してゲームなどの開始条件おそらくうまくいくでしょう。間違いなく、これを暗号やその他のものに使用しているなら、それに頼らないでください。攻撃者はargcがロードされる場所に影響を及ぼすようなことをすることができます。つまり、あなたのCライブラリには、rand()とsrand()関数が完備されています。これは、デバッグに非常に役立つ特定の値を意図的に与えることができます。私は個人的に乱数が必要なときはいつでもそれに固執します。あなたが本当にランダム性が必要な場合は

1

、あなたはのいずれかを使用する必要があります、ランダム

  1. は/ dev/
  2. は/ dev/urandomのこれら2上の情報については

    を参照してくださいHow to use /dev/random or urandom in C?

  3. srand()

    播種に関する情報srand()はここにあります:Recommended way to initialize srand?

  4. 専用に設計された外部ライブラリ。 `&argc`は()` `srand関数に使用する良い種がある場合

    ここA good random number generator for C

関連する問題