MISC-安全流量:
导出http数据流,一眼jsp可以想到冰蟹流量
发现key:b9e008ae3315a9d4
flag{08ca4a8d32bd08b13f260f224a834b75}Re-寻找序列号:
寻找正确的序列号,flag格式为everflag{}。
以 key ‘abcdef9876543210’(LE u32)对密文做 XXTEA 解密
(sum 每轮减 0x61C88647 的实现)
解密结果是若干 u32 的字节拼接;
最后一个 u32 为原始长度 42。按该长度截取前 42 字节,
即明文 everflag{cd00b4953fe9a109148f350427ceddbd}
#!/usr/bin/python# Write Python 3 code in this online editor and run it.# B64 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzxvtrpnljhfdbywusqomkigeca0123456789#$'# def b64_decode_custom(s):# val = {c:i for i,c in enumerate(B64)}# n=0;bits=0;out=bytearray()# for ch in s:# n=(n<<6)|val[ch]; bits+=6# if bits>=8:# bits-=8# out.append((n>>bits)&0xFF)# return bytes(out)# enc = 'xGFH5z2#A4VdtPIvlBoX0hFBLXC6h9AdRSrpM8hiXr3RBiLALa9FyiQPtUQHSGhk'# cipher = b64_decode_custom(enc)# (# print(cipher.hex()))# import struct# def to_u32_list_le(b):# n = len(b) // 4# return list(struct.unpack('<' + 'I'*n, b))# def from_u32_list_le(v):# return struct.pack('<' + 'I'*len(v), *v)# def xxtea_encrypt(v, k):# n = len(v)# if n < 2:# return v[:]# DELTA = 0x9E3779B9# z = v[n-1]# y = 0# s = 0# rounds = 6 + 52 // n# while rounds > 0:# s = (s + DELTA) & 0xFFFFFFFF# e = (s >> 2) & 3# for p in range(n-1):# y = v[p+1]# mx = (((z>>5) ^ (y<<2)) + ((y>>3) ^ (z<<4))) ^ ((s ^ y) + (k[(p & 3) ^ e] ^ z))# v[p] = (v[p] + mx) & 0xFFFFFFFF# z = v[p]# y = v[0]# mx = (((z>>5) ^ (y<<2)) + ((y>>3) ^ (z<<4))) ^ ((s ^ y) + (k[((n-1) & 3) ^ e] ^ z))# v[n-1] = (v[n-1] + mx) & 0xFFFFFFFF# z = v[n-1]# rounds -= 1# return v# def xxtea_decrypt(v, k):# n = len(v)# if n < 2:# return v[:]# DELTA = 0x9E3779B9# rounds = 6 + 52 // n# s = (rounds * DELTA) & 0xFFFFFFFF# y = v[0]# while rounds > 0:# e = (s >> 2) & 3# for p in range(n-1, 0, -1):# z = v[p-1]# mx = (((z>>5) ^ (y<<2)) + ((y>>3) ^ (z<<4))) ^ ((s ^ y) + (k[(p & 3) ^ e] ^ z))# v[p] = (v[p] - mx) & 0xFFFFFFFF# y = v[p]# z = v[n-1]# mx = (((z>>5) ^ (y<<2)) + ((y>>3) ^ (z<<4))) ^ ((s ^ y) + (k[(0 & 3) ^ e] ^ z))# v[0] = (v[0] - mx) & 0xFFFFFFFF# y = v[0]# s = (s - DELTA) & 0xFFFFFFFF# rounds -= 1# return v# key_bytes = b'abcdef9876543210'# k = list(struct.unpack('<4I', key_bytes))# cipher = b64_decode_custom(enc)# v = to_u32_list_le(cipher)# orig = xxtea_decrypt(v[:], k)# orig_bytes = from_u32_list_le(orig)# print(len(orig_bytes), orig_bytes[:16].hex(), orig[-1])# print(orig_bytes.decode('latin1', errors='ignore')[:48])# -*- coding: utf-8 -*-# Solve for: everflag{cd00b4953fe9a109148f350427ceddbd}# 同时复刻了题目里的加密管线(XXTEA + 自定义Base64)做校验B64 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzxvtrpnljhfdbywusqomkigeca0123456789#$'KEY_ASCII = b'abcdef9876543210'TARGET = 'xGFH5z2#A4VdtPIvlBoX0hFBLXC6h9AdRSrpM8hiXr3RBiLALa9FyiQPtUQHSGhk'FLAG = 'everflag{cd00b4953fe9a109148f350427ceddbd}'# ---- 下面是题目里 sub_4021F0 的自定义 Base64 编码(索引顺序 v18, v19, i, v21)----def b64_encode_custom_from_function(b: bytes) -> str:out = []dst = B64aint = 0n3 = 0v22 = len(b)idx = 0while v22:byte = b[idx]; idx += 1; v22 -= 1aint = (aint & ~(0xFF << (8*n3))) | (byte << (8*n3))n3 += 1if n3 == 3:v18 = (aint & 0xFF) >> 2v19 = (((aint>>8) & 0xFF) >> 4) + 16*((aint & 0xFF) & 3)v21 = ((aint>>16) & 0xFF) & 0x3Fi_idx = (((aint>>16) & 0xFF) >> 6) + 4*(((aint>>8) & 0xFF) & 0xF)for val in [v18, v19, i_idx, v21]:out.append(dst[val])n3 = 0aint = 0if n3:v18 = (aint & 0xFF) >> 2v19 = (((aint>>8)&0xFF) >> 4) + 16*((aint & 0xFF) & 3)v21 = ((aint>>16)&0xFF) & 0x3Fi_idx = (((aint>>16)&0xFF) >> 6) + 4*(((aint>>8)&0xFF) & 0xF)order = [v18, v19, i_idx, v21]count = n3 + 1for j in range(count):out.append(dst[order[j]])for _ in range(4-count):out.append('=')return ''.join(out)# ---- 下面复刻 sub_402AA0 / sub_402980 / sub_402B50 的“正向”加密管线 ----def pack_string_le_with_len(s: bytes):n = len(s)v4 = n//4 + (1 if n % 4 else 0)words = [0]*v4for i in range(n):idx = i//4; shift = 8*(i%4)words[idx] = (words[idx] | (s[i] << shift)) & 0xFFFFFFFFwords.append(n) # 末尾追加长度(42)return wordsdef pack_key_le(s: bytes):n = len(s)v4 = n//4 + (1 if n % 4 else 0)words = [0]*v4for i in range(n):idx = i//4; shift = 8*(i%4)words[idx] = (words[idx] | (s[i] << shift)) & 0xFFFFFFFFreturn words # 仅打包,不追加长度def xxtea_encrypt_like_402980(v, key):n = len(v)if n <= 1:return vlast = v[n-1]rounds = 52//n + 6sumv = 0for _ in range(rounds):sumv = (sumv - 0x9E3779B9) & 0xFFFFFFFF # 注意:这题是 sum 递减版本e = (sumv >> 2) & 3# p: 0..n-2for p in range(n-1):y = v[p+1]mx = ((((last << 4) & 0xFFFFFFFF) ^ (y >> 3)) + ((last >> 5) ^ ((y << 2) & 0xFFFFFFFF)))mx ^= ((sumv ^ y) + (key[(e ^ (p & 3))] ^ last)) & 0xFFFFFFFFlast = (v[p] + mx) & 0xFFFFFFFFv[p] = last# 最后一个y0 = v[0]mx = ((((last << 4) & 0xFFFFFFFF) ^ (y0 >> 3)) + ((last >> 5) ^ ((y0 << 2) & 0xFFFFFFFF)))mx ^= ((sumv ^ y0) + (key[(e ^ ((n-1) & 3))] ^ last)) & 0xFFFFFFFFlast = (v[n-1] + mx) & 0xFFFFFFFFv[n-1] = lastreturn vdef words_to_bytes_le(words):out = bytearray()for w in words:out += w.to_bytes(4, 'little')return bytes(out)def encode_pipeline(plain_ascii: str) -> str:v = pack_string_le_with_len(plain_ascii.encode('ascii'))k = pack_key_le(KEY_ASCII)v = xxtea_encrypt_like_402980(v, k)ct_bytes = words_to_bytes_le(v)[:-0] # 跟题里一致,直接 4*n 字节return b64_encode_custom_from_function(ct_bytes)if __name__ == '__main__':print(FLAG)
#artContent h1{font-size:16px;font-weight: 400;}#artContent p img{float:none !important;}#artContent table{width:100% !important;}
