前言
题目名称:就五层你能解开吗
题目来源:BugKu
1.CRC32
-
打开题目的压缩包发现需要密码,但是可以发现pwd1.txt ~ pwd3.txt,都是6字节,再加上里面的CRC32,让人很容易想到CRC32攻击手段。
-
我也有开源项目zip-crc-tools,但是是攻击zip文件的,由于这个是7z的文件,目前没有时间加入这个格式的文件,所以我们使用theonlypwner/crc32,进行爆破明文,需要注意是的由于这个项目的默认爆破字符集里面没有一些特殊符号,所以我们必须要修改一下这个项目crc32.py的代码。
修改crc32.py
的字符集:
- 开始攻击,肉眼可以看出这个是比较有意义的字符串
- 剩下的pwd2和pwd3的文本文件,使用上面的手段,就可以拿到明文了,然后组合在一起就是这个7z的密码了:
_CRC32_i5_n0t_s4f3
2.维吉尼亚
- 根据tips.txt的提示,我们知道了,我们需要解密这个维吉尼亚密文。
-
密文在cipher.txt,keys.txt里面有1000个密码,这种重复的事情,肯定是上代码喽
-
由于前几天,出了一个换26x26表的题目,所以我直接用我封装好的维吉尼亚脚本。
因为这个题目喊我们找密码,密码的英文
password
,但是维吉尼亚加解密的时候,会小写转换为大写,所以我们就爆破keys.txt
里面的所有key
,使用PASSWORD
作为关键字就好了。from src import Vigenere # 使用的我是封装好了维吉尼亚加解密过程 with open("ciphertext.txt", "r") as f: cipher_text = f.read() with open("keys.txt", "r") as f: keys = f.read() keys = keys.splitlines() for key in keys: if "PASSWORD" in (plan_text := Vigenere.Vigenere(key).decipher(cipher_text)): print(plan_text) break
运行结果: THE VIGENERE CIPHER IS A METHOD OF ENCRYPTING ALPHABETIC TEXT BY USING A SERIES OF DIFFERENT CAESAR CIPHERS BASED ON THE LETTERS OF A KEYWORD IT IS A SIMPLE FORM OF POLYALPHABETIC SUBSTITUTION SO PASSWORD IS VIGENERE CIPHER FUNNY
得到密码:
VIGENERE CIPHER FUNNY
,大写试过,没成功,所以我们使用小写vigenere cipher funny
,成功解压出来了。
3.爆破SHA1
上代码即可:
# 不完整密码: *7*5-*4*3?
# 不完整sha-1: 619c20c*a4de755*9be9a8b*b7cbfa5*e8b4365*
import string
import hashlib
import itertools
# 1.先定义几个字符集到时候使用
str_digits = string.digits
str_upper = string.ascii_uppercase
str_lower = string.ascii_lowercase
str_printable = string.printable
password = "%s7%s5-%s4%s3?"
for chrs in itertools.product(str_printable, repeat=4):
pwd = password % chrs
if (hash_str := hashlib.sha1(pwd.encode()).hexdigest()).startswith("619c20c"):
print(pwd, hash_str)
运行结果:
s7v5-T4`3? 619c20c33dbeff190fab0d5498f0789e3ec1519a
I7~5-s4F3? 619c20c4a4de75519be9a8b7b7cbfa54e8b4365b
根据运行结果,我们成功拿到了解压密码I7~5-s4F3?
,爆破速度也不慢,我就上个厕所回来就出来了。
4.MD5
关于MD5校验,这个地方我之前看过关于MD5的视频:哔哩哔哩-MD5为何不再安全, 视频的11:55
使用选择前缀碰撞攻击,已经实现了一样的MD5,出输出了不一样的内容。感兴趣,可以看一下这个视频。
所以这一层的密码是:Goodbye World :-(
5.RSA
这一层,flag.enc我看了一下没有base64加密,我们写代码来解吧,这样以后碰到base64的也能变通。
import sympy
import libnum
from Crypto.PublicKey import RSA
# 1.read flag.enc
with open("flag.enc", "rb") as f:
flag = f.read()
c = libnum.s2n(flag)
# 2.read pub_key
with open("rsa_public_key.pem") as f:
pub_key = RSA.import_key(f.read())
n = pub_key.n
e = pub_key.e
# 3.使用factordb查询的
p = 15991846970993213322072626901560749932686325766403404864023341810735319249066370916090640926219079368845510444031400322229147771682961132420481897362843199
q = 28805791771260259486856902729020438686670354441296247148207862836064657849735343618207098163901787287368569768472521344635567334299356760080507454640207003
phi_n = (p - 1) * (q - 1)
d = sympy.mod_inverse(e, phi_n)
m = pow(c, d, n)
print(libnum.n2s(m))
运行结果:
b'\x02\xb3\xf3\xc6W8\xb5\x81S/cwr\xe8\xd3\xb5Cf\xe4\xe5w\x81h\t\x82\x8cd\x85D}\xec7\xec!\xe4;\x89\xb3w\xa4Uf\xf5\xd9%\xcb\x96\x85\x10\x11B\x9a<"QS\x05\x84\x80{\xb1.\x82\xcc\x1c\xf6\x87z@\x91\x9e\xf6h\xe7\xa1\x8f\x96\x9d%&\xa4\xcd\xf0\'\x16J\xf4!\x9c\'h8!Y\xa1o(H\xea}\x00flag{W0rld_Of_Crypt0gr@phy}'
成功拿到FLAG:flag{W0rld_Of_Crypt0gr@phy}