我可以使用argc在main中的地址作为随机源吗?
我想创建一个只需要一个随机数的程序,所以我尝试使用main函数中argc的地址作为随机源,因为我认为程序在内存中的位置是随机的,而且它可以保存一些include语句,所以我尝试:我可以使用argc在main中的地址作为随机源吗?,c,pointers,random,main,argc,C,Pointers,Random,Main,Argc,我想创建一个只需要一个随机数的程序,所以我尝试使用main函数中argc的地址作为随机源,因为我认为程序在内存中的位置是随机的,而且它可以保存一些include语句,所以我尝试: #include <stdio.h> int main(int argc,const char* argv[]){ printf("%lu\n",(unsigned long int)&argv/sizeof(unsigned long int)); return 0; } 原因是
#include <stdio.h>
int main(int argc,const char* argv[]){
printf("%lu\n",(unsigned long int)&argv/sizeof(unsigned long int));
return 0;
}
原因是什么?使用argc的地址作为随机数是可能的吗
然后我尝试删除地址中的一些位:
#include <stdio.h>
int main(int argc,const char* argv[]){
printf("%lu\n",(unsigned long int)&argv >> 12);
return 0;
}
这是将argc地址转换为随机数的“正确”方法吗
原因是什么
对于您的体系结构,我假设是x86,int
是4个字节,这意味着每个int
应该与一个可被4整除的地址对齐(这正是您看到的行为)
使用argc的地址作为随机数是可能的吗
可能吗。你只要去做就行了
这是个好主意吗?不,绝对不是。原因见下文
这是将argc地址转换为随机数的“正确”方法吗
我假设“正确”是指熵的良好来源,答案是否定的
现代操作系统中存在一定程度的熵,但它并不意味着是熵的良好来源。这只是为了让别人更难利用你程序中的漏洞进行安全攻击。ASLR确实没有任何保证(如果您真的想关闭它,您可以在某些操作系统中关闭它)
简而言之,不应该使用变量的地址作为熵的来源。这不是一个很好的随机性来源。它是4的倍数,因为函数地址将在我所知道的每个平台上进行字对齐(我假设这是x86或x86_64?) 从某种意义上讲,argc的地址可能是“随机”的,因为你可能不知道它是什么,所以如果你用它来为游戏或任何可能有效的东西设定开始条件;如果您将其用于加密或其他用途,则绝对不要依赖它——攻击者可能会影响argc的加载位置
这就是说,您的C库附带了完全可行的rand()和srand()函数,作为奖励,它可以让您故意为它添加一个特定的值,这对调试非常有帮助;我个人认为,每当我需要随机数时,我都会坚持这一点。如果你真的需要随机性,你应该使用以下方法之一:
您是否在询问
&argc
是否是用于srand()
的好种子?程序在内存中的位置不太可能是随机的。操作系统使用一种算法来确定程序在内存中的位置,该算法反映了操作系统选择的一些策略。实际上,没有“一个随机数”这样的东西。有随机的数字序列。如果每次运行程序只需要一个编号,则必须从程序外部生成的序列中选择该编号。John Hascall对/dev/random的建议是一个很好的选择。像random.com这样的网站是另一个例子。
#include <stdio.h>
int main(int argc,const char* argv[]){
printf("%lu\n",(unsigned long int)&argv >> 12);
return 0;
}
34359070631
34359034616
34359078055
34359080624