python调用md系列算法破解ctf题目

版权声明:本文为博主原创文章,未经博主允许可以转载。 https://blog.csdn.net/helloexp/article/details/82217194

题目

某银行客户端以安全著称,所有网络流量都开启了密码学防护机制。有一天,你抓到了局域网中的网银登录流量。在这个流量中,密码字段的值为   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

猜你喜欢

转载自blog.csdn.net/helloexp/article/details/82217194