1. 程式人生 > >python呼叫md系列演算法破解ctf題目

python呼叫md系列演算法破解ctf題目

 

題目

某銀行客戶端以安全著稱,所有網路流量都開啟了密碼學防護機制。有一天,你抓到了區域網中的網銀登入流量。在這個流量中,密碼欄位的值為   5ef5ce92fc409703a834adabd2bc861c

根據分析,你獲得瞭如下的線索:

  • 上面抓到的登入流量密碼欄位是 md系列雜湊演算法的雜湊值。
  • 這個登入密碼也是銀行卡的 ATM 取款密碼。
  • 登入密碼的雜湊值是加鹽之後計算的結果,根據逆向分析,鹽的值是使用者名稱的拼音,而你推測出了流量來自於鄰居 “張三丰”

有了這些線索之後,你能夠分析出密碼是什麼嗎?
flag 提交格式: flag{密碼_雜湊演算法_鹽}
舉例: flag{123456_md999_lisi}    老鐵們有什麼思路嗎

 

 


解題思路:

舉例中給的是md系列的演算法,常見的有md2、md4、md5演算法(演算法長度都與題目中的hash長度相符),其中md5使用最為廣泛

  • MD2演算法產生於1989年
  • MD4演算法產生於1990年
  • MD5演算法產生於1991年

鑑於md5使用最為廣泛,先從md5進行解題,方法:python呼叫hashlib實現hash碰撞

具體示例如下:
 

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import hashlib

#md5實現hash碰撞


for x in xrange(1,1000000):
		
	print 'password=',x,' ---> ' ,hashlib.md5(str(x)+'zhangsanfeng').hexdigest()
	pass

首先來看一下能不能成功執行

可以看到上面結果,已經成功執行(程式碼有待後續優化)

 

把我們題目中的hash放進程式碼作為判斷,看看能否碰撞出結果

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import hashlib

#md5實現hash碰撞


for x in xrange(1,1000001):
		
	if '5ef5ce92fc409703a834adabd2bc861c'==hashlib.md5(str(x)+'zhangsanfeng').hexdigest():
		print 'found the key  ','password=',str(x)+'zhangsanfeng',' ---> ' ,hashlib.md5(str(x)+'zhangsanfeng').hexdigest()
		break
	pass
	if x==1000000:
		print 'not found!!!'

執行結果如上,發現沒有,找到,看來採用的不是md5演算法;

我們接下來看看是否為md4

簡單修改指令碼:把md5改為md4,指令碼如下

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import hashlib

#md5實現hash碰撞


for x in xrange(1,1000001):
		
	if '5ef5ce92fc409703a834adabd2bc861c'==hashlib.md4(str(x)+'zhangsanfeng').hexdigest():
		print 'found the key  ','password=',str(x)+'zhangsanfeng',' ---> ' ,hashlib.md4(str(x)+'zhangsanfeng').hexdigest()
		break
	pass
	if x==1000000:
		print 'not found!!!'

執行結果如上,WTF(這裡請分開讀  W  C  T,嗯,與ctf類似),竟然出錯了,找不到md4,hashlib這麼牛的一個庫,竟然沒有實現md4,太匪夷所思了,檢視官方幫助看一下

可以看到,明明包含md4、md5,但是為啥不能執行呢,仔細找找,通過構造可以實現對md4的呼叫

修改後的程式碼如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import hashlib

#md5實現hash碰撞


for x in xrange(1,1000001):
		
	if '5ef5ce92fc409703a834adabd2bc861c'==hashlib.new('md4',str(x)+'zhangsanfeng').hexdigest():
		print 'found the key  ','password=',str(x)+'zhangsanfeng',' ---> ' ,hashlib.new('md4',str(x)+'zhangsanfeng').hexdigest()
		break
	pass
	if x==1000000:
		print 'not found!!!'

可以看到,已經成功找到password,構造flag--->flag{187345_md4_zhangsanfeng}

 

hash線上驗證連結:https://www.qqxiuzi.cn/bianma/md2.php