日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[GKCTF 2021]Random

發(fā)布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [GKCTF 2021]Random 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

[GKCTF 2021]Random

題目

import random from hashlib import md5def get_mask():file = open("random.txt","w")for i in range(104):file.write(str(random.getrandbits(32))+"\n")file.write(str(random.getrandbits(64))+"\n")file.write(str(random.getrandbits(96))+"\n")file.close() get_mask() flag = md5(str(random.getrandbits(32)).encode()).hexdigest() print(flag)

解題

通過讀代碼,知道是求生成104組隨機(jī)數(shù)之后的一個隨機(jī)數(shù)

通過算法出的隨機(jī)數(shù)是偽隨機(jī)數(shù),這里用到的隨機(jī)數(shù)生成函數(shù)是random.getrandbits(k)

random.getrandbits(k)
返回具有 k 個隨機(jī)比特位的非負(fù) Python 整數(shù)。 此方法隨 MersenneTwister 生成器一起提供,其他一些生成器也可能將其作為 API 的可選部分提供。 在可能的情況下,getrandbits() 會啟用 randrange() 來處理任意大的區(qū)間。
在 3.9 版更改: 此方法現(xiàn)在接受零作為 k 的值。

所以這又是梅森算法了, MersenneTwister是為了解決過去偽隨機(jī)數(shù)生成器PRNG產(chǎn)生的偽隨機(jī)數(shù)質(zhì)量不高而生成的。(指路詳細(xì)解析梅森旋轉(zhuǎn)算法:傳送門)。我們了解到 MT19937能做生成在 1≤k≤623 個32位均勻分布的隨機(jī)數(shù)。而正巧我們已經(jīng)有624(104+104?(64/32)+104?(96/32)=624104+104*(64/32)+104*(96/32)=624104+104?(64/32)+104?(96/32)=624)個生成的隨機(jī)數(shù)了,也就是說,根據(jù)已經(jīng)有的隨機(jī)數(shù)我們完全可以推出下面會生成的隨機(jī)數(shù)。

需要用到的是randcrack的庫

先了解一下randcrack

randcrack
工作原理
該生成器基于MersenneTwisterMersenneTwisterMersenneTwister(梅森算法),能夠生成具有優(yōu)異統(tǒng)計特性的數(shù)字(與真正的隨機(jī)數(shù)無法區(qū)分)。但是,此生成器的設(shè)計目的不是加密安全的。您不應(yīng)在關(guān)鍵應(yīng)用程序中用作加密方案的PRNG。
您可以[在維基百科上]了解有關(guān)此生成器的更多信息(https://en.wikipedia.org/wiki/Mersenne_Twister).
這個餅干的工作原理如下。
它從生成器獲得前624個32位數(shù)字,并獲得Mersenne Twister矩陣的最可能狀態(tài),即內(nèi)部狀態(tài)。從這一點(diǎn)來看,發(fā)電機(jī)應(yīng)該與裂解器同步。
如何使用
將生成器生成的32位整數(shù)準(zhǔn)確地輸入cracker非常重要,因?yàn)樗鼈儫o論如何都會生成,但如果您不請求它們,則會刪除它們。 同樣,您必須在出現(xiàn)新種子之后,或者在生成624?32624*32624?32位之后,準(zhǔn)確地為破解程序饋電,因?yàn)槊總€624?32624*32624?32位數(shù)字生成器都會改變其狀態(tài),并且破解程序設(shè)計為從某個狀態(tài)開始饋電。

(忘了這一段是從哪里復(fù)制下來仍百度翻譯的結(jié)果了)
大致意思就是:
RandCrack中有一個方法是predict_getrandbits(),在給出的隨機(jī)數(shù)數(shù)量多時,可以預(yù)測下一個隨機(jī)數(shù)。

腳本參考

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())

代碼就很容易讀懂了,先將我們有的隨機(jī)數(shù)排列到一個列表ll中,然后挨個用RandCrack.submit()提交,最后用RandCrack.predict_getrandbits()預(yù)測下一個32位隨機(jī)數(shù),然后md5一下輸出就好了

運(yùn)行得到:14c71fec812b754b2061a35a4f6d8421

答案

GKCTF{14c71fec812b754b2061a35a4f6d8421}
(坑人,檢查好幾遍不知道哪錯了,最后發(fā)現(xiàn)錯到格式上了)

總結(jié)

以上是生活随笔為你收集整理的[GKCTF 2021]Random的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。