文章目錄
- 黑客密室逃脫
- ezEvtx
- flowzip
- Enigma
- 星際xml解析器
- EBC-Train
- AES-CBC
黑客密室逃脫
提示猜文件名,猜幾個常見的,app.py讀到源碼
這里也是腦抽了一下,把密鑰看成1236了。。。卡了五分鐘左右,解出來的時候已經降到300多分了,加密過程并不復雜,兩式相減還原回去即可
from Crypto.Util.number import *
key='secret_key1236'
enc='d9d1c4d9e0abc29d9bb292689863a89899a492a892cccba669689566a0c7c8a6c8a692d0c6dc959898b3'
def simple_encrypt(text, key):encrypted = bytearray()for i in range(len(text)):char = text[i]key_char = key[i % len(key)]encrypted.append(ord(char) + ord(key_char))return encrypted.hex()
enc1=int(enc,16)
enc2=long_to_bytes(enc1)
print(enc2)
def decrypt(text, key):encrypted = bytearray()for i in range(len(text)):char = text[i]key_char = key[i % len(key)]encrypted.append(char - ord(key_char))return encryptedprint(decrypt(enc2,key))
ezEvtx
沒啥好說的,隨便過濾一下就找到了
flowzip
流量分析一把梭
Enigma
賽博廚子一把梭
星際xml解析器
常規xxe,讀文件即可
https://www.cnblogs.com/Eleven-Liu/p/8612821.html
EBC-Train
這個也是在賽后才想明白,aes加密用的是十六字節,將前十一個都填成AAAA發過去,因為ecb模式是分組加密,每一組的加密過程都是一樣的,所以不需要寫腳本還原加密過程去破解(其實硬寫也做不到,因為拿不到key,當時我覺得用戶名肯定是key,不然解不了,于是就一直卡在這一步了,實際上用戶名是明文),直接將發過來的加密數據取出后幾組就是admin的加密了
AES-CBC
from Crypto.Cipher import AES # 導入AES加密模塊
from secret import flag # 從secret模塊導入flag(假設為明文)
import random, os # 導入random和os模塊用于隨機數生成# 為消息填充字節,使其長度為16的倍數
def pad(msg):return msg + bytes([16 - len(msg) % 16 for _ in range(16 - len(msg) % 16)])# 對密鑰進行隨機置換,生成新密鑰
def permutation(key):tables = [hex(_)[2:] for _ in range(16)] # 生成0-15的十六進制表(去掉"0x"前綴)random.shuffle(tables) # 隨機打亂表newkey = "".join(tables[int(key[_], 16)] for _ in range(len(key))) # 根據原密鑰生成新密鑰return newkey# 生成初始密鑰key0及其置換密鑰key1
def gen():key0 = os.urandom(16).hex() # 隨機生成16字節密鑰并轉為十六進制字符串key1 = permutation(key0) # 對key0進行置換生成key1return key0, key1# 使用key0和key1進行雙重AES加密
def encrypt(key0, key1, msg):aes0 = AES.new(key0, AES.MODE_CBC, key1) # 用key0加密,key1作為CBC模式的IVaes1 = AES.new(key1, AES.MODE_CBC, key0) # 用key1解密,key0作為CBC模式的IVreturn aes1.decrypt(aes0.encrypt(msg)) # 先加密后解密生成密文# 生成密鑰對
key0, key1 = gen()
a0, a1 = int(key0, 16), int(key1, 16) # 將密鑰轉為整數gift = a0 & a1 # 計算key0和key1的按位與,作為泄露信息
cipher = encrypt(bytes.fromhex(key0), bytes.fromhex(key1), pad(flag)) # 加密填充后的flagprint(f"gift = {gift}")
print(f"key1 = {key1}")
print(f"cipher = {cipher}")'''
gift = 64698960125130294692475067384121553664
key1 = 74aeb356c6eb74f364cd316497c0f714
cipher = b'6\xbf\x9b\xb1\x93\x14\x82\x9a\xa4\xc2\xaf\xd0L\xad\xbb5\x0e|>\x8c|\xf0^dl~X\xc7R\xcaZ\xab\x16\xbe r\xf6Pl\xe0\x93\xfc)\x0e\x93\x8e\xd3\xd6'
'''
這道題想到思路了,但是忘記dfs怎么寫了,腳本沒寫出來。。。
首先是一個按位與,我們都知道,如果gift的結果是1,那說明參與按位與的兩個數在對應位置上一定是1.
由此可以確定大概三十幾位key0中一定為1的位
接著,我們計算key1異或gift,得到的結果中如果為1的位,說明key0中對應的位置一定為0
由此又可以確定三十幾位
總共就128位,那么剩下的其實只有五十多位了,按照這樣的思路再確定一些位,比如使用按位或,再確定一些位,最后壓縮到三十位左右就可以爆破出來了