CTF伪随机数爆破

要了解伪随机数的爆破首先你的先知道什么是PHP种子,

借用在rand()函数中,我们可以通过设置随机数种子来影响随机数的生成。例如,在rand()函数中加入了随机数种子编码后,每次运行程序将会生成同样的随机整数序列。这个就是伪随机数,因为种子是已知的。

这里使用

X1NOoo大神的举例:

mt_scrand()
mt_rand()  
mt_scrand(seed)这个函数的意思就是分发seed种子,种子有了后,靠mt_rand()生成随机数。

例如我们写一个脚本

mt_srand(55555);    
echo mt_rand()."
";
?> 
//输出277249736
如果我们多输入几次呢

mt_srand(12345);    
echo mt_rand()."
";
echo mt_rand()."
";
echo mt_rand()."
";
echo mt_rand()."
";
?>

//输出277249736
230135029
1872932720
1536240435
大家可以发现,这就是伪随机数的漏洞,存在可预测性。

例如,下面的程序演示如何使用rand()函数和随机数种子:

1

2

3

4

5

6

7

8

$seed = 10;

srand($seed);

for ($i=0; $i<10; $i++) {

    echo rand(), "
"
;

}

?>

上述代码中,我们指定了随机数种子为10。通过srand()函数设置随机数种子后,程序将会生成一个包含10个整数的随机数序列。每次运行程序都会生成同样的10个整数。这就是随机数种子的作用。

例题:

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');
}

这道题目也是一样,由于种子是可以猜出的,所以

这道题实际上是一个伪随机数,因为在随机数生成中,种子值是一个起始点,它用于初始化随机数生成器。随机数生成器根据种子值生成一系列伪随机数。如果使用相同的种子值,随机数生成器将生成相同的随机数序列。

直接上脚本

CTF伪随机数爆破_第1张图片

r=1155388967

得到flag

你可能感兴趣的:(PHP,web安全,伪随机数)