24-25下半学年第二次线上赛 | Writeup
莫斯档案馆 每一层有一个pwd.png和一个压缩包,pwd.png是一个彩色条纹和圆点的非常小的图像,也就是摩斯密码,套了很多很多层,写脚本去识别摩斯密码,并递归解压。 from PIL import Image import re def getMorse(image): """ 从图像中提取莫尔斯电码 假定背景颜色是固定的,莫尔斯电码具有不同的颜色。 莫尔斯电码可以是任何颜色,只要它与左上像素的颜色不同。 >>> getMorse('pwd.png') ['----.'] """ im = Image.open(image, 'r') chars = [] background = im.getdata()[0] for i, v in enumerate(list(im.getdata())): if v == background: chars.append(" ") else: chars.append("*") output = "".join(chars) # 清理输出,去除前后的空白 # 然后将每组3个星号转换为短横线 # 将星号转换为实际的点 # 将字母之间的空格(即>1个背景像素)转换为分隔符 # 删除空白 # 返回字母的列表 output = re.sub(r'^\s*', '', output) output = re.sub(r'\s*$', '', output) output = re.sub(r'\*{3}', '-', output) output = re.sub(r'\*', '.', output) output = re.sub(r'\s{2,}', ' | ', output) output = re.sub(r'\s', '', output) output = output.split('|') return output def getPassword(morse): """ 解码莫尔斯电码 将莫尔斯电码转换回文本。 以字母列表为输入,返回转换后的文本。 注意,挑战使用小写字母。 >>> getPassword(['----.']) '9' """ MORSE_CODE_DICT = { '.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E', '..-.': 'F', '--.': 'G', '....': 'H', '..': 'I', '.---': 'J', '-.-': 'K', '.-..': 'L', '--': 'M', '-.': 'N', '---': 'O', '.--.': 'P', '--.-': 'Q', '.-.': 'R', '...': 'S', '-': 'T', '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X', '-.--': 'Y', '--..': 'Z', '-----': '0', '.----': '1', '..---': '2', '...--': '3', '....-': '4', '.....': '5', '-....': '6', '--...': '7', '---..': '8', '----.': '9', '-..-.': '/', '.-.-.-': '.', '-.--.-': ')', '..--..': '?', '-.--.': '(', '-....-': '-', '--..--': ',' } for item in morse: return "".join([MORSE_CODE_DICT.get(item) for item in morse]).lower() def main(): """ 自动启动 用于自动化。 自动调用方法并使用'pwd.png'作为输入图像。 """ print(getPassword(getMorse("pwd.png"))) if __name__ == "__main__": main() 并使用sh脚本去循环执行 ...