CTF伪随机数爆破

要了解伪随机数的爆破首先你的先知道什么是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

<?PHP

$seed = 10;

srand($seed);

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

    echo rand(), "<br/>";

}

?>

上述代码中,我们指定了随机数种子为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

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值