题目描述

解题步骤

下载附件,得到:

1
2
3
4
5
6
7
8
9
import hashlib   
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM')
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print des

从代码来看,这是一个 CTF 中的 MD5 碰撞/爆破题。目标是:

  • 在字符串 'TASC' + chr(i) + 'O3RJMV' + chr(j) + 'WDJKX' + chr(k) + 'ZM' 中,
  • 爆破三个可打印字符 i, j, k(ASCII 32~126),
  • 使得其 MD5 哈希值中包含子串:e9032da911513
  • 找到后输出该 MD5。

注意:
原始代码存在 Python 2 vs Python 3 兼容性问题
m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM')

Python 2 中,字符串是字节串,默认可以传给 hashlib.md5()

但在 Python 3 中:

  • hashlib.md5() 的输入必须是 bytes 类型
  • 字符串是 Unicode,不能直接拼接 chr() 和传入

此外,print des 是 Python 2 语法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import hashlib

# 搜索范围:可打印 ASCII 字符(32 到 126)
for i in range(32, 127):
for j in range(32, 127):
for k in range(32, 127):
# 构造明文
plaintext = 'TASC' + chr(i) + 'O3RJMV' + chr(j) + 'WDJKX' + chr(k) + 'ZM'

# 计算 MD5
m = hashlib.md5()
m.update(plaintext.encode('utf-8')) # 必须 encode 成 bytes
digest = m.hexdigest()

# 检查是否包含指定子串
if 'e9032' in digest and 'da' in digest and '911513' in digest:
print(f"Found! Plaintext: {plaintext}")
print(f"MD5: {digest}")
# 如果只需要一个结果,可以 break
# break 只能跳出一层循环,所以用 flag 控制或直接 exit
import sys
sys.exit(0)
1
2
Found! Plaintext: TASCJO3RJMVKWDJKXLZM
MD5: e9032994dabac08080091151380478a2

flag{e9032994dabac08080091151380478a2}

就是正确的结果了