刚班聚回到学校,看到i春秋公众号发了一道题目

很明显就是一个伪随机数的问题
我们编程语言中的随机数一般都是通过一个随机数种子来产生
当我们确定一个随机数种子后,那么后面产生的随机数的大小和顺序就是固定的了

php中可以用mt_srand(number)来指定当前生成随机数采用的随机数种子
那么我们就可以通过改变mt_srand的参数来爆破随机数种子

1
2
3
4
5
6
7
<?php
for ($i=0; $i < 2147483647; $i++) {
mt_srand($i);
if (mt_rand() == 2013658111) {
echo "$i";
}
}

这里的2147483647等于2的32次方减一
据说这个就是随机数种子的范围
当然采用上面的脚本爆破爆破起来很慢,这里可以直接用一个开源工具来爆破
工具下载:

1
git clone https://github.com/lepiaf/php_mt_seed.git

使用方法:
比如我们这道题里设置随机数种子后产生的第一个随机数为:
2013658111
那么我们输入:

1
./php_mt_seed 2013658111


我们可以看到满足条件的种子有4个
我们用如下php脚本改变mt_srand的参数来输出不同种子前20次随机数,然后对比题目中的找到种子和flag

1
2
3
4
5
6
<?php
mt_srand(2403190090);
for ($i=0; $i <20 ; $i++) {
echo mt_rand();
echo "<br>";
}

最终得到种子为2403190090
flag为1830147655

× 请我吃糖~
打赏二维码