要了解伪随机数的爆破首先你的先知道什么是PHP种子,
借用在rand()函数中,我们可以通过设置随机数种子来影响随机数的生成。例如,在rand()函数中加入了随机数种子编码后,每次运行程序将会生成同样的随机整数序列。这个就是伪随机数,因为种子是已知的。
这里使用
X1NOoo大神的举例:
mt_scrand()
mt_rand()
mt_scrand(seed)这个函数的意思就是分发seed种子,种子有了后,靠mt_rand()生成随机数。
例如我们写一个脚本
<?php
mt_srand(55555);
echo mt_rand()."<br/>";
?>
//输出277249736
如果我们多输入几次呢
<?php
mt_srand(12345);
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
?>
//输出277249736
230135029
1872932720
1536240435
大家可以发现,这就是伪随机数的漏洞,存在可预测性。
例如,下面的程序演示如何使用rand()函数和随机数种子:
1 2 3 4 5 6 7 8 |
|
上述代码中,我们指定了随机数种子为10。通过srand()函数设置随机数种子后,程序将会生成一个包含10个整数的随机数序列。每次运行程序都会生成同样的10个整数。这就是随机数种子的作用。
例题:
<?php
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(372619038);
if(intval($r)===intval(mt_rand())){
echo $flag;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
这道题目也是一样,由于种子是可以猜出的,所以
这道题实际上是一个伪随机数,因为在随机数生成中,种子值是一个起始点,它用于初始化随机数生成器。随机数生成器根据种子值生成一系列伪随机数。如果使用相同的种子值,随机数生成器将生成相同的随机数序列。
直接上脚本
r=1155388967
得到flag