[GKCTF 2021]Random
[GKCTF 2021]Random
題目
解題
通過讀代碼,知道是求生成104組隨機數之后的一個隨機數
通過算法出的隨機數是偽隨機數,這里用到的隨機數生成函數是random.getrandbits(k)
random.getrandbits(k)
返回具有 k 個隨機比特位的非負 Python 整數。 此方法隨 MersenneTwister 生成器一起提供,其他一些生成器也可能將其作為 API 的可選部分提供。 在可能的情況下,getrandbits() 會啟用 randrange() 來處理任意大的區間。
在 3.9 版更改: 此方法現在接受零作為 k 的值。
所以這又是梅森算法了, MersenneTwister是為了解決過去偽隨機數生成器PRNG產生的偽隨機數質量不高而生成的。(指路詳細解析梅森旋轉算法:傳送門)。我們了解到 MT19937能做生成在 1≤k≤623 個32位均勻分布的隨機數。而正巧我們已經有624(104+104?(64/32)+104?(96/32)=624104+104*(64/32)+104*(96/32)=624104+104?(64/32)+104?(96/32)=624)個生成的隨機數了,也就是說,根據已經有的隨機數我們完全可以推出下面會生成的隨機數。
需要用到的是randcrack的庫
先了解一下randcrack
randcrack
工作原理
該生成器基于MersenneTwisterMersenneTwisterMersenneTwister(梅森算法),能夠生成具有優異統計特性的數字(與真正的隨機數無法區分)。但是,此生成器的設計目的不是加密安全的。您不應在關鍵應用程序中用作加密方案的PRNG。
您可以[在維基百科上]了解有關此生成器的更多信息(https://en.wikipedia.org/wiki/Mersenne_Twister).
這個餅干的工作原理如下。
它從生成器獲得前624個32位數字,并獲得Mersenne Twister矩陣的最可能狀態,即內部狀態。從這一點來看,發電機應該與裂解器同步。
如何使用
將生成器生成的32位整數準確地輸入cracker非常重要,因為它們無論如何都會生成,但如果您不請求它們,則會刪除它們。 同樣,您必須在出現新種子之后,或者在生成624?32624*32624?32位之后,準確地為破解程序饋電,因為每個624?32624*32624?32位數字生成器都會改變其狀態,并且破解程序設計為從某個狀態開始饋電。
(忘了這一段是從哪里復制下來仍百度翻譯的結果了)
大致意思就是:
RandCrack中有一個方法是predict_getrandbits(),在給出的隨機數數量多時,可以預測下一個隨機數。
腳本參考
from hashlib import md5 from randcrack import RandCrack def foo(l,i):a=[]a.append(l[i])b1=l[i+1]>>32b2=l[i+1]&(2**32-1)a.append(b2)a.append(b1)b1=l[i+2]>>64b2=(l[i+2]&(2**64-1))>>32b3=l[i+2]&(2**32-1)a.append(b3)a.append(b2)a.append(b1)return a with open(r'random.txt','r') as f:l=f.readlines() l=[int(i.strip()) for i in l] ll=[] for i in range(0,len(l),3):ll+=foo(l,i) rc=RandCrack() for i in ll:rc.submit(i) aa=rc.predict_getrandbits(32) print(md5(str(aa).encode()).hexdigest())代碼就很容易讀懂了,先將我們有的隨機數排列到一個列表ll中,然后挨個用RandCrack.submit()提交,最后用RandCrack.predict_getrandbits()預測下一個32位隨機數,然后md5一下輸出就好了
運行得到:14c71fec812b754b2061a35a4f6d8421
答案
GKCTF{14c71fec812b754b2061a35a4f6d8421}
(坑人,檢查好幾遍不知道哪錯了,最后發現錯到格式上了)
總結
以上是生活随笔為你收集整理的[GKCTF 2021]Random的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [BSidesSF2020]decryp
- 下一篇: 强网杯2019 Copperstudy