伪随机数种子爆破

伪随机数种子爆破

一、前言
ctf中有很多php随机数的题目,考察方式一般如下:

给定一个随机数,求产生随机数的种子。

做这种题,先了解点知识

二、基础知识
php产生随机数
php 通过 以下两个函数产生随机数

mt_srand() //播种 Mersenne Twister 随机数生成器。
mt_rand()   //生成随机数
应用代码为

<?php  
mt_srand(1234);    
echo mt_rand()."</br>";
echo mt_rand()."</br>";
echo mt_rand()."</br>";
?>  
结果如下



简单说,给定一个种子,由这个 种子 产生随机数

那 为什么是 伪随机数呢?

因为同一个种子产生的随机数只会根据调用次数的不同产生不同的数。

比如上面的例子,当种子为1234时,

种子产生的前三个随机数就都是
1741177057
1068724585
1335968403

 漏洞产生
所以显而易见,随机数的产生,基于种子。但是,可以通过产生的随机数来猜测种子,进而推测后续的随机数。

需要指明的是,不同版本的php,同一个种子产生的随机数有可能不同。

爆破种子
利用工具
php_mt_seed - PHP mt_rand() seed cracker



使用方法
这个是用C语言编写的工具,里面的一个库是Windows下没有的,推荐用Linux直接用。

我们拖入kali

解压

tar -zxvf php_mt_seed-4.0.tar.gz
进入文件夹

cd php_mt_seed-4.0.tar.gz
编译

make
爆破

./php_mt_seed 1739865909
输出结果:

root@kali:~/桌面/php_mt_seed-4.0# make
gcc -Wall -march=native -mtune=generic -O2 -fomit-frame-pointer -funroll-loops -fopenmp php_mt_seed.c -o php_mt_seed
php_mt_seed.c:47:2: warning: #warning AVX-512 not enabled. Try gcc -mavx512f (on Intel Knights Landing, Skylake-X, or some newer). [-Wcpp]
   47 | #warning AVX-512 not enabled. Try gcc -mavx512f (on Intel Knights Landing, Skylake-X, or some newer).
      |  ^~~~~~~
root@kali:~/桌面/php_mt_seed-4.0# ./php_mt_seed 1739865909
Pattern: EXACT
Version: 3.0.7 to 5.2.0
Found 0, trying 0xf8000000 - 0xfbffffff, speed 14347.4 Mseeds/s 
seed = 0xf8844e10 = 4169420304 (PHP 3.0.7 to 5.2.0)
seed = 0xf8844e11 = 4169420305 (PHP 3.0.7 to 5.2.0)
Found 2, trying 0xfc000000 - 0xffffffff, speed 14578.8 Mseeds/s 
Version: 5.2.1+
Found 2, trying 0x00000000 - 0x01ffffff, speed 0.0 Mseeds/s 
seed = 0x00abac87 = 11250823 (PHP 5.2.1 to 7.0.x; HHVM)
Found 3, trying 0x0c000000 - 0x0dffffff, speed 129.9 Mseeds/s 
seed = 0x0d8938af = 227096751 (PHP 5.2.1 to 7.0.x; HHVM)
Found 4, trying 0x96000000 - 0x97ffffff, speed 88.4 Mseeds/s  
seed = 0x979aac4e = 2543496270 (PHP 5.2.1 to 7.0.x; HHVM)
Found 5, trying 0xfe000000 - 0xffffffff, speed 83.8 Mseeds/s 
Found 5
root@kali:~/桌面/php_mt_seed-4.0# 
根据不同的php版本爆破出了不同的种子,挨个试就行了。

image-20221014113057691

然后可以利用伪随机数种子生成随机数

<?php  
mt_srand(1145146);    
echo mt_rand()."</br>";
echo mt_rand()."</br>";
echo mt_rand()."</br>";

image-20221014113142132

尝试生成的随机数找到合适的

posted @ 2022-10-27 11:20  GTL_JU  阅读(395)  评论(0编辑  收藏  举报