給出了一個可以連接的地址,試著連接得

讓我們輸入一字串,長度要為15,且經過sha384加密后,最后六位字符為'd709bb',可根據這些寫一個小小的腳本來找出符合這些條件的字串
如下:
import hashlib import string,random for i in range(100000000000000,199999999999999): temp=hashlib.sha384(str(i).encode()).hexdigest() if temp[-6:]=='d709bb': print(str(i)) break
結果如下:

輸入字串后,又顯示

輸入B后,顯示代碼如下:
def babymd5(m, n, x_head, y_head, x, y): if x.startswith(x_head) and y.startswith(y_head): for _ in range(m): xhash = md5(x.encode('utf-8')).hexdigest() x = xhash for _ in range(n): yhash = md5(y.encode('utf-8')).hexdigest() y = yhash if xhash == yhash: return True return False
輸入C后,顯示代碼如下:
| (m, n, x_head, y_head) = (202, 201, 'nPz', 'dead')
輸入R后,提示讓我們輸入x
總結一下,流程大概就是已知一個函式babymd5和引數條件,即函式的引數前4個為(202,201,'nPz','dead'),讓我們輸入讓函式babymd5回傳結果為True的x和y
分析下函式babymd5的大概流程:
①判斷x是否以x_head開頭,y是否以y_head開頭,若此條件不通過,則直接回傳false
②將x進行md5加密,并對每次的結果進行回圈加密,總加密次數為m次,最后加密結果為xhash
③將y進行md5加密,并對每次的結果進行回圈加密,總加密次數為n次,最后加密結果為yhash
④若最后xhash與yhash恒相等,那么函式會回傳True,否則回傳False
這里難點就是如何找到這樣的x和y,使得它們經過不同次數的md5加密后,值會相等,(我就被難倒了!參考了下wphttps://github.com/TalaatHarb/ctf-writeups/blob/main/asisctf2020/babymd5,寫的很詳細!)
函式中,很特殊的一個程序就是對結果反復進行回圈加密,而y_head='dead','dead'又是一個合法的十六進制表示,且x加密回圈的次數m>對y回圈加密的次數n,故,我們可以把y看成x回圈md5加密n次后的一個中間結果,即只要找到這樣的一個x,對它進行回圈解密n次后,它的結果temphashx恰以'dead'開頭,而這個結果temphashx也就是我們需要的y,腳本如下:
import hashlib import string,random def babymd5(m, n, x_head, y_head, x, y): if x.startswith(x_head) and y.startswith(y_head): for _ in range(m): xhash = hashlib.md5(x.encode('utf-8')).hexdigest() x = xhash for _ in range(n): yhash = hashlib.md5(y.encode('utf-8')).hexdigest() y = yhash if xhash == yhash: return True return False dict=string.ascii_letters+string.digits+string.punctuation print(dict) counter=1 found=False length=32 x_head='nPz' y_head='dead' m=202 n=201 while not found: tmp=x_head+''.join(random.choice(dict) for _ in range(length)) possible_x=tmp res=tmp for _ in range(m-n): res=hashlib.md5(res.encode()).hexdigest() if res.startswith('dead'): possible_x=res x=tmp y=res print("x:",x) print("y:",y) found=babymd5(202, 201, 'nPz', 'dead',x,y) break if(counter%10000==0): print("attemp:"+str(counter)+'次') if(counter%100000==0): print("attemp:"+str(counter)+'次') counter=counter+1
得到結果:

輸入對應的x和y后,得到flag!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/235278.html
標籤:其他
上一篇:web手嘗試解密(水文章)
下一篇:簡潔易讀的API檔案
