php伪随机数爆破

php伪随机数爆破

涉及到的函数为mt_rand()

mt_rand(min, max)

返回min到max之间的伪随机数,如果参数缺省,则返回0到RAND_MAX之间的伪随机数。
不同于常规的伪随机数生成器,mt_rand()函数使用内置的算法直接生成种子,来生成伪随机数,不需要用户手动播种。

Note: 自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 给随机数发生器播种,因为现在是由系统自动完成的。

php_mt_seed

伪随机数爆破工具,原理很简单,跑遍所有串,对每个串求伪随机数,如果输入串为当前伪随机数子集,即找到了相应的种子。

可以看到这个工具速度还是很快的,php早期版本的伪随机数都可以在零点几秒内全部跑完,到了php7.1以后时间稍长,但都可以接受。

这里我随便输入了一个数跑了下

botm@AoiAZU:~/php_mt_seed-4.0$ ./php_mt_seed 123878781
Pattern: EXACT
Version: 3.0.7 to 5.2.0
Found 0, trying 0x40000000 - 0x43ffffff, speed 11930.5 Mseeds/s
seed = 0x4025821e = 1076199966 (PHP 3.0.7 to 5.2.0)
seed = 0x4025821f = 1076199967 (PHP 3.0.7 to 5.2.0)
Found 2, trying 0xfc000000 - 0xffffffff, speed 13638.3 Mseeds/s
Version: 5.2.1+
Found 2, trying 0x0e000000 - 0x0fffffff, speed 169.0 Mseeds/s
seed = 0x0ef838f0 = 251148528 (PHP 5.2.1 to 7.0.x; HHVM)
Found 3, trying 0x7e000000 - 0x7fffffff, speed 161.6 Mseeds/s
seed = 0x7e4ff30c = 2119168780 (PHP 5.2.1 to 7.0.x; HHVM)
seed = 0x7e4ff30c = 2119168780 (PHP 7.1.0+)
Found 5, trying 0x88000000 - 0x89ffffff, speed 161.0 Mseeds/s
seed = 0x886399c1 = 2288228801 (PHP 5.2.1 to 7.0.x; HHVM)
Found 6, trying 0x90000000 - 0x91ffffff, speed 160.7 Mseeds/s
seed = 0x91db7e3c = 2447081020 (PHP 7.1.0+)
Found 7, trying 0x94000000 - 0x95ffffff, speed 160.6 Mseeds/s
seed = 0x9471380c = 2490447884 (PHP 5.2.1 to 7.0.x; HHVM)
Found 8, trying 0xa6000000 - 0xa7ffffff, speed 160.0 Mseeds/s
seed = 0xa71454a1 = 2803127457 (PHP 5.2.1 to 7.0.x; HHVM)
Found 9, trying 0xfe000000 - 0xffffffff, speed 155.7 Mseeds/s
Found 9

速度相当夸张,一秒钟169M,1.69亿一秒。

相关题目

[GWCTF 2019]枯燥的抽奖


这里的图直接搬的别的博客的,昨天写的题目。

他这里生成的伪随机数还不是直接用来当答案,他是用伪随机数当字母串的下标。

str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
str2='utP4yKDDVV'
str3 = str1[::-1]     # 倒序
length = len(str2)    # 10
res=''
for i in range(len(str2)):
    for j in range(len(str1)):
        if str2[i] == str1[j]:
            res+=str(j)+' '+str(j)+' '+'0'+' '+str(len(str1)-1)+' '
            break
print res
————————————————
版权声明:本文为CSDN博主「WHOAMIAnony」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45521281/article/details/107302795

搬的脚本,意思是将随机出来的伪随机串的下标还原回来。
对于str2的每一位,找到其在str1中的下标,即为一开始的伪随机串。
最后的结果

20 20 0 61 19 19 0 61 51 51 0 61 30 30 0 61 24 24 0 61 46 46 0 61 39 39 0 61 39 39 0 61 57 57 0 61 57 57 0 61

这个串是对php_mt_seed串的输入做了适应,似乎是离散参数的规范,但我没搞明白为什么要重复一次。
似乎是 “随机数a 随机数a min max”这样一个格式,四个一组。
整一串离散参数丢进php_mt_seed跑一会出种子,然后再用php里面的mt_rand(种子)跑出来完整的随机数串

posted @ 2022-01-04 22:17  AikNr  阅读(458)  评论(0编辑  收藏  举报