题解一自定义AES变形加密AES-ECB分组碰撞爆破一、题目简介本题为中等难度分组密码CTF赛题基于标准AES算法进行自定义改造采用极不安全的ECB电子密码本模式加密Flag同时开放用户自定义明文加密接口。核心考点为AES-ECB模式固有安全缺陷、明文可控下的分组密文碰撞攻击、多分组逐字节爆破逻辑规避了基础编码解密聚焦分组密码底层漏洞利用适合密码学进阶学习者练习。题目核心特性固定16字节密钥、自定义PKCS7填充、Flag明文固定格式、用户可控明文加密、无初始向量IV。二、题目完整源码pythonfrom Crypto.Cipher import AESimport os#固定密钥题目内置不可获取KEY os.urandom(16)FLAG flag{cust0m_aes_ecb_vuln_2026}def pad(s):# 自定义pkcs7填充pad_len 16 - len(s) % 16return s chr(pad_len)*pad_lendef encrypt(plain):aes AES.new(KEY, AES.MODE_ECB)return aes.encrypt(pad(plain.encode())).hex()# 交互逻辑if __name__ __main__:print(Welcome to Custom AES Encrypt!)print(1. Encrypt your own text)print(2. Get flag ciphertext)while True:opt input(Input your option: )if opt 1:text input(Input your text: )print(Ciphertext:, encrypt(text))elif opt 2:print(Flag Ciphertext:, encrypt(FLAG))else:print(Error option!)三、漏洞原理深度分析1. AES-ECB模式致命缺陷AES-ECB是最简单、最不安全的分组加密模式无初始向量IV、无分组混淆逻辑加密规则为相同的16字节明文分组会生成完全一致的密文分组。分组长度固定为16字节十六进制展示为32位字符所有分组独立加密、互不干扰。相较于CBC、GCM等安全模式ECB无法抵御重放、碰撞、明文爆破攻击是CTF分组密码高频漏洞考点。2.题目可利用条件明文可控用户可任意输入明文并获取对应密文可自定义分组内容Flag格式固定以flag{开头、}结尾字符范围为可打印字符爆破空间可控密文可获取可直接读取完整Flag加密密文用于分组碰撞匹配Flag跨多分组区别于入门单分组题目本题Flag占用多个16字节分组需要分段精准爆破难度进阶。3.核心攻击逻辑通过占位填充偏移逐步构造明文分组让用户自定义分组与Flag未知分组完全重合。利用ECB密文分组唯一性通过密文碰撞匹配正确字符逐字节枚举爆破最终拼接完整Flag。四、分步解题思路获取目标密文调用题目接口获取完整Flag加密密文按32位十六进制16字节为单位拆分多个密文分组构造偏移填充使用固定字符A占位通过递减填充长度控制未知Flag字符落在分组末尾逐字符枚举爆破基于已知Flag前缀拼接待枚举可打印字符加密后匹配对应密文分组循环拼接终止匹配成功则记录字符、拓展已知Flag内容循环迭代直至读取到结尾}终止爆破输出完整Flag整合所有爆破字符得到完整明文Flag。五、完整EXP脚本pythonimport stringfrom pwn import *#连接本地/远程题目服务io process(encrypt.py)# io remote(localhost, 9999)# 获取flag密文def get_flag_cipher():io.sendlineafter(boption: , b2)io.recvuntil(bFlag Ciphertext: )return io.recvline().strip().decode()# 自定义明文加密def get_user_cipher(text):io.sendlineafter(boption: , b1)io.sendlineafter(btext: , text.encode())io.recvuntil(bCiphertext: )return io.recvline().strip().decode()def aes_ecb_brute():flag charset string.printable.strip() # 所有可打印字符集flag_cipher get_flag_cipher()block_size 32 # 16字节分组 32位十六进制字符# 逐字节爆破预估flag最大长度60位for i in range(60):# 计算填充长度制造分组偏移pad A * (15 - i % 16)target_block i // 16# 枚举所有可打印字符匹配正确位for char in charset:test_plain pad flag chartest_cipher get_user_cipher(test_plain)# 分组密文碰撞匹配if test_cipher[:block_size] flag_cipher[target_block*block_size:(target_block1)*block_size]:flag charprint(fCurrent flag: {flag})break# 读取到flag结尾终止爆破if } in flag:breakprint(f\n[] Final Flag: {flag})if __name__ __main__:aes_ecb_brute()六、运行结果与最终答案脚本运行后逐位枚举匹配实时输出爆破进度最终完整输出Final Flag: flag{cust0m_aes_ecb_vuln_2026}七、题目总结与学习要点本题是CTF密码学AES考点的中等难度标杆题型摒弃了简单的密钥泄露、直接解密套路重点考察对ECB分组加密底层逻辑的理解和手动爆破逻辑的实现。核心学习要点深刻理解AES-ECB模式的安全缺陷明确相同明文分组对应相同密文分组的核心特性掌握分组偏移、占位填充、密文碰撞的攻击思路适配多分组加密场景学会针对固定格式明文的逐字节爆破方法可迁移至所有ECB模式漏洞题目。