mt_rand()伪随机数伪造

发布时间 2023-10-31 17:17:26作者: Eddie_Murphy

来自

[GWCTF 2019]枯燥的抽奖

打开网页是个猜flag的东西,显然不可能真去猜,重新加载一下网页f12看到了个check.php的请求,我们访问得到源码:

看看代码逻辑:

1.生成种子 

2.设置生成的字符

3.生成长度为20的随机字符

其中$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1); 的意思就是截取$str_long1的某个字符

 

这里用了rand和mt_rand,看似这个随机数没办法找,但是果真如此吗?

可以注意到,我们猜测字符串是采用伪随机函数依据种子生成的,所以我们当然可以利用脚本通过给出的部分字符串逆推出伪随机函数采用的种子。

 

先写个php把这串字符串梭成需要的数据格式:

<?php
error_reporting(0);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$string='SpwElFxjZy';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
$pos=strpos($str_long1,$string[$i]);
    echo $pos." ".$pos." 0 61 " ;  
}
?>

然后用一个php_mt_seed的工具: