##解题思路
首先查看附件,一个python脚本,一个包含一堆md5值
解读python脚本,可以得知,这个python脚本,引入了flag进行处理,最终将flag的每个字符进行md5加密,并单独为一行
import hashlib # 导入 hashlib 库,用于计算哈希值(如 MD5)
from multiprocessing import Pool # 导入多进程库中的 Pool 类,用于并行计算
def compute_md5(char):
"""计算单个字符的 MD5 哈希值"""
# 将字符转换为字节(默认使用 UTF-8 编码)
byte_char = char.encode()
# 创建 MD5 哈希对象并更新数据
md5_flag = hashlib.md5(byte_char)
# 获取十六进制形式的哈希值字符串(如 "8fa14cdd...")
hex_digest = md5_flag.hexdigest()
return hex_digest # 返回该字符的 MD5 值
if __name__ == '__main__':
# 主程序入口:读取 flag 文件内容
with open('flag', 'r') as flag_file:
content = flag_file.read() # 以字符串形式读取整个文件内容
# 将字符串拆分为单个字符的列表(如 "abc" → ['a', 'b', 'c'])
chars = list(content)
# 使用多进程池并行计算每个字符的 MD5
with Pool() as pool:
# map() 函数将 chars 列表中的每个字符传递给 compute_md5 函数
# 并行计算所有字符的 MD5 值,返回结果列表
md5_results = pool.map(compute_md5, chars)
# 将结果写入 output 文件,每行一个 MD5 值
with open('output', 'w') as output_file:
for result in md5_results:
output_file.write(result + '\n') # 每个结果后换行
因此我们只需要用同一个库,将每一个可打印字符转换成md5形式,形成彩虹表进行碰撞即可得到最终的flag
最终我们可以编写如下脚本,得到flag
import hashlib
# 生成彩虹表
def generate_rainbow_table():
rainbow_table = {}
# 可打印字符范围
for char in range(32, 127): # ASCII码从32到126是可打印字符
char = chr(char)
md5_hash = hashlib.md5(char.encode()).hexdigest()
rainbow_table[md5_hash] = char
return rainbow_table
# 解码MD5值
def decode_md5_values(md5_list, rainbow_table):
flag = ''
for md5_value in md5_list:
if md5_value in rainbow_table:
flag += rainbow_table[md5_value]
else:
flag += '?' # 如果找不到对应的字符,用?代替
return flag
# 主函数
if __name__ == '__main__':
# 给定的MD5值列表
md5_list = [
'8fa14cdd754f91cc6554c9e71929cce7',
'2db95e8e1a9267b7a1188556b2013b33',
'0cc175b9c0f1b6a831c399e269772661',
'b2f5ff47436671b6e533d8dc3614845d',
'f95b70fdc3088560732a5ac135644506',
'61e9c06ea9a85a5088a499df6458d276',
'e1671797c52e15f763380b45e841ec32',
'c4ca4238a0b923820dcc509a6f75849b',
'4a8a08f09d37b73795649038408b5f33',
'cfcd208495d565ef66e7dff9f98764da',
'6f8f57715090da2632453988d9a1501b',
'e1671797c52e15f763380b45e841ec32',
'b14a7b8059d9c055954c92674ce60032',
'e358efa489f58062f10dd7316b65649e',
'cfcd208495d565ef66e7dff9f98764da',
'b14a7b8059d9c055954c92674ce60032',
'e358efa489f58062f10dd7316b65649e',
'2510c39011c5be704182423e3a695e91',
'e1671797c52e15f763380b45e841ec32',
'b14a7b8059d9c055954c92674ce60032',
'f1290186a5d0b1ceab27f4e77c0c5d68',
'cfcd208495d565ef66e7dff9f98764da',
'4b43b0aee35624cd95b910189b3dc231',
'c4ca4238a0b923820dcc509a6f75849b',
'8277e0910d750195b448797616e091ad',
'b14a7b8059d9c055954c92674ce60032',
'cfcd208495d565ef66e7dff9f98764da',
'8fa14cdd754f91cc6554c9e71929cce7',
'b14a7b8059d9c055954c92674ce60032',
'6f8f57715090da2632453988d9a1501b',
'8277e0910d750195b448797616e091ad',
'e4da3b7fbbce2345d7772b0674a318d5',
'cbb184dd8e05c9709e5dcaedaa0495cf'
]
# 生成彩虹表
rainbow_table = generate_rainbow_table()
# 解码MD5值
flag = decode_md5_values(md5_list, rainbow_table)
# 输出结果
print("解码后的Flag:", flag)
当然还有一种简单粗暴的方法,那就是将每一行md5值,放入md5解码网站进行解码,如下图