php偽隨機數爆破
阿新 • • 發佈:2022-01-05
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(種子)跑出來完整的隨機數串