找到
13
篇与
CTF
相关的结果
-
2025强网杯check-little题目完整解析 mo5zifi9.png图片 🔍 题目本质:GCD攻击 文档分析得非常透彻: 关键发现:gcd(c, N) ≠ 1,说明 c 和 N 有公因子 根本原因:题目中的 key 恰好等于 p(一个质因子)! 数学原理: c = key^e mod N = p^3 mod (p*q) 由于 p^3 包含因子 p,而 N = p*q 也包含因子 p 所以 gcd(c, N) = p(或 q) ✅ 正确解题方案 #!/usr/bin/env python3 from Crypto.Util.number import * from Crypto.Cipher import AES # 题目数据 e = 3 N = 18795243691459931102679430418438577487182868999316355192329142792373332586982081116157618183340526639820832594356060100434223256500692328397325525717520080923556460823312550686675855168462443732972471029248411895298194999914208659844399140111591879226279321744653193556611846787451047972910648795242491084639500678558330667893360111323258122486680221135246164012614985963764584815966847653119900209852482555918436454431153882157632072409074334094233788430465032930223125694295658614266389920401471772802803071627375280742728932143483927710162457745102593163282789292008750587642545379046283071314559771249725541879213 c = 10533300439600777643268954021939765793377776034841545127500272060105769355397400380934565940944293911825384343828681859639313880125620499839918040578655561456321389174383085564588456624238888480505180939435564595727140532113029361282409382333574306251485795629774577583957179093609859781367901165327940565735323086825447814974110726030148323680609961403138324646232852291416574755593047121480956947869087939071823527722768175903469966103381291413103667682997447846635505884329254225027757330301667560501132286709888787328511645949099996122044170859558132933579900575094757359623257652088436229324185557055090878651740 iv = b'\x91\x16\x04\xb9\xf0RJ\xdd\xf7}\x8cW\xe7n\x81\x8d' ciphertext = 'bf87027bc63e69d3096365703a6d47b559e0364b1605092b6473ecde6babeff2' print("=== RSA GCD攻击 ===") # 步骤1: 计算 gcd(N, c) 来分解 N print("[1] 计算 gcd(N, c)...") p = GCD(N, c) # 或者 gcd(N, c) 也行 print(f" p = {p}") # 步骤2: 计算另一个因子 q q = N // p print(f" q = {q}") # 验证分解是否正确 assert p * q == N print(" ✓ 验证: p * q = N") # 步骤3: 计算欧拉函数 phi = (p - 1) * (q - 1) print(f" φ(N) = {phi}") # 步骤4: 计算私钥 d d = inverse(e, phi) print(f" d = {d}") # 步骤5: RSA 解密得到 key key = pow(c, d, N) print(f" key = {key}") print(f" key == p ? {key == p}") # 步骤6: AES-CBC 解密 flag aes_key = long_to_bytes(key)[:16] print(f" AES key (hex): {aes_key.hex()}") cipher = AES.new(key=aes_key, iv=iv, mode=AES.MODE_CBC) flag_bytes = cipher.decrypt(bytes.fromhex(ciphertext)) # 尝试去除 padding try: from Crypto.Util.Padding import unpad flag = unpad(flag_bytes, 16).decode('utf-8') print(f"\n🎉 成功解出 FLAG: {flag}") except: # 尝试手动去除 padding flag = flag_bytes.rstrip(b'\x00').rstrip(b'\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10').decode('utf-8') print(f"\n🎉 成功解出 FLAG: {flag}") print("\n=== 分析 ===") print("这道题的关键在于:") print(f"- key = {key} (恰好等于质因子 p = {p})") print("- c = key^3 mod N = p^3 mod (p*q) 必然包含因子 p") print("- 因此 gcd(c, N) = p,直接分解了 RSA 模数") print("- 这就是 'm may be divisible by p' 的含义")🎯 预期结果 运行后你应该看到: === RSA GCD攻击 === [1] 计算 gcd(N, c)... p = 147199016045711432751638821206308445008264556310138298317988445918295214070009189642863602736928620075708961292355772144107904072422081464952790328676245442353824750499664935214066308400409281606421061272247951127310089903404542920084748985854316064209036479288096221482644500085802435454794064096852047366391 q = 127685932938731221992817899539092641593668680700108840338907777364248158387793117420926162525549739317540333658811102811316274156507102712368770516894542906645781063123612802169333621393006523907942055597359469312381323007967788830402803370144148475302470248532284938017009759945821701787408489909925749848443 ✓ 验证: p * q = N φ(N) = ... d = ... key = 147199016045711432751638821206308445008264556310138298317988445918295214070009189642863602736928620075708961292355772144107904072422081464952790328676245442353824750499664935214066308400409281606421061272247951127310089903404542920084748985854316064209036479288096221482644500085802435454794064096852047366391 key == p ? True AES key (hex): d19e4ca2afb21642baf44b48768b8106 🎉 成功解出 FLAG: flag{m_m4y_6e_divIS1b1e_by_p?!}🧠 关键要点总结 GCD攻击:当 gcd(ciphertext, N) ≠ 1 时,说明密文和模数有公因子,可直接分解 题目设计:key 恰好等于 p,这是人为构造的漏洞场景 防御措施: 检查 gcd(c, N) == 1 确保消息与模数互质 使用合适的填充方案 这道题完美展示了看似安全的RSA实现如何因为不当的消息选择而导致整个系统崩溃! -
2023 宁波天一永安杯 Crypto - rsa 题解:低指数 RSA 特殊构造解密实战 2023 宁波天一永安杯 Crypto - rsa 题解:低指数 RSA 特殊构造解密实战 一、题目背景 赛事:宁波天一·永安杯 2023 题目类型:Crypto(RSA 加密逆向·特殊构造) 核心线索:给定公钥 e=65537、模数 n、密文 c 及特殊值 a,需通过非标准 RSA 解密逻辑还原明文 目标:还原明文 Flag,格式为 flag{} mo1e3yn8.png图片 二、解题思路与核心分析 1. 题目核心特征 本题并非标准 RSA 解密题,而是基于 RSA 思想的特殊构造加密: 题目未直接给出素数 p、q,而是提供了一个关键值 a 解密过程不依赖标准 RSA 私钥计算,而是通过模幂运算结合偏移量穷举还原明文 核心逻辑:通过 c 与 a 计算出基础值 x,再通过 m = x + k*a(k 为偏移量)穷举得到明文 2. 解题脚本解析 脚本结合 gmpy2 与 PyCryptodome 库,实现特殊构造 RSA 的解密流程: 步骤 1:导入依赖库 gmpy2.invert:计算模逆元 Crypto.Util.number.long_to_bytes:将大数转换为字节流 from gmpy2 import invert from Crypto.Util.number import long_to_bytes 步骤 2:定义题目参数 将题目给出的 e、n、c、a 代入脚本: # 题目给定参数 e = 65537 n = 36535558847082719901201561031181835346574576610950713924924272947759193576365817762980927638691696601293089537315055413746788190208875234794229119049056299551864869870291634941246362436491006904347559559494705922259007299126640817275929491680601926404543198957206717290905220235571289759182878331893962038379 c = 532997872940452282189043430008002793694788439822465302532208754231005799057972378308576109082463996551992533174546386979606697890310597738637156771564229 a = 2694858406312563434474553988904403597551484373358339092528913028454100111881368126493990657117571672510331411186745639563619323775673115439步骤 3:计算基础解密值 x 通过模逆与模幂运算,基于 a 计算出基础解密值 x: # 计算模逆元 d,对应 e 在模 (a-1) 下的逆 d = invert(e, a-1) # 计算 x = c^d mod a x = pow(c, d, a)步骤 4:穷举偏移量还原明文 由于明文 m 满足 m ≡ x (mod a),即 m = x + k*a(k 为非负整数),通过穷举 k 并验证解码结果,找到符合 flag{} 格式的明文: # 穷举偏移量 k,范围 0-19 for k in range(20): m = x + k * a try: # 将大数转换为字节流并解码为 UTF-8 字符串 flag = long_to_bytes(m).decode('utf-8') # 验证是否为题目要求的 flag 格式 if flag.startswith('flag{') and flag.endswith('}'): print(flag) break except: continue三、解题结果 脚本运行后,在 k=1 附近穷举得到符合格式的明文: flag{p01la4d_rHo_a1gOr1thM_r1gh4}四、核心知识点总结 1. 特殊构造 RSA 解密思路 本题并非标准 RSA 解密,而是利用模运算的周期性构造的特殊加密: 明文 m 满足 m ≡ x (mod a),因此 m 是 x 加上 a 的整数倍 穷举 k 时,由于 Flag 长度固定,k 通常为较小的非负整数(本题 k 在 0-20 范围内即可命中) 2. 大数转字符串避坑 使用 long_to_bytes(m).decode('utf-8') 时,需捕获 UnicodeDecodeError,避免因偏移量错误导致的解码失败 必须验证字符串格式(flag{...}),防止误判非明文的解码结果 3. 常见特殊 RSA 变种 变种类型特征解决思路低指数攻击e 较小(如 3/7/17),明文短直接求 e 次根共模攻击多个用户使用同一模数 n利用 gcd(e1, e2) 求逆本构造类型给出特殊值 a,明文 m ≡ x (mod a)穷举 k 偏移量还原明文五、完整运行脚本 from gmpy2 import invert from Crypto.Util.number import long_to_bytes # 题目给定参数 e = 65537 n = 36535558847082719901201561031181835346574576610950713924924272947759193576365817762980927638691696601293089537315055413746788190208875234794229119049056299551864869870291634941246362436491006904347559559494705922259007299126640817275929491680601926404543198957206717290905220235571289759182878331893962038379 c = 532997872940452282189043430008002793694788439822465302532208754231005799057972378308576109082463996551992533174546386979606697890310597738637156771564229 a = 2694858406312563434474553988904403597551484373358339092528913028454100111881368126493990657117571672510331411186745639563619323775673115439 # 计算模逆元 d d = invert(e, a-1) # 计算基础解密值 x x = pow(c, d, a) # 穷举偏移量 k 还原明文 for k in range(20): m = x + k * a try: flag = long_to_bytes(m).decode('utf-8') if flag.startswith('flag{') and flag.endswith('}'): print(f"Flag: {flag}") break except: continue -
2023 宁波天一永安杯 Crypto - secret 题解:RSA 隐式指数与高次根求解实战 2023 宁波天一永安杯 Crypto - secret 题解:RSA 隐式指数与高次根求解实战 一、题目背景 赛事:宁波天一·永安杯 2023 题目类型:Crypto(RSA 加密破解) 核心线索:给定大素数 p、q,密文 c,公钥指数 e=28,但实际解密需修正指数并通过高次根求解 目标:还原明文 Flag,格式为 flag{} mo1e4qmg.png图片 二、解题思路与核心分析 1. 题目核心特征 本题是典型的 RSA 加密逆向题目,但存在两个关键陷阱: 给定的公钥指数 e=28 并非实际解密指数,需通过数学推导还原真实加密/解密逻辑 解密后得到的明文并非直接字符串,而是经过 4 次幂运算后的数值,需对大数进行精确高次根求解 2. 关键数学原理 RSA 加密核心公式: 加密:$c = m^e \pmod{n}$ 解密:$m = c^d \pmod{n}$(其中 $d = e^{-1} \pmod{\phi(n)}$,$\phi(n) = (p-1)(q-1)$) 本题特殊点: 计算发现使用 e=28 求解的 d 无法直接得到明文,实际加密指数为 7(脚本中验证的关键参数) 明文 m 经过 $m = \text{flag}^4$ 运算后再进行 RSA 加密,因此解密后需对结果求 4 次根还原 Flag 3. 解题脚本解析 我们使用 Python 结合 gmpy2 库完成大数运算与高次根求解,核心步骤如下: 步骤 1:导入依赖库 gmpy2 是处理大数运算的核心库,提供了模逆运算、高次根求解等高效函数: from gmpy2 import invert, iroot步骤 2:定义已知参数 将题目给出的 p、q、n、c 及修正后的指数 e=7 代入: # 已知大素数 p, q p = 134261118796789547851478407090640074022214132682000430136383795981942884853000826171189906102866323044078348933419038543719361923320694974970600426450755845839235949167391987970330836004768360774676424958554946699767582105556239177450470656065560178592346659948800891455240736405480828554486592172443394370831 q = 147847444534152128997546931602292266094740889347154192420554904651813340915744328104100065373294346723964356736436709934871741161328286944150242733445542228293036404657556168844723521815836689387184856871091025434896710605688594847400051686361372872763001355411405782508020591933546964183881743133374126947753 # 模数 n n = 19850163314401552502654477751795889962324360064924594948231168092741951675262933573691070993863763290962945190372400262526595224437463969238332927564085237271719298626877917792595603744433881409963046292095205686879015029586659384866719514948181682427744555313382838805740723664050846950001916332631397606277703888492927635867870538709596993987439225247816137975156657119509372023083507772730332482775258444611462771095896380644997011341265021719189098262072756342069189262188127428079017418048118345180074280858160934483114966968365184788420091050939327341754449300121493187658865378182447547202838325648863844192743 # 密文 c c = 13913396366755010607043477552577268277928241319101215381662331498046080625902831202486646020767568921881185124894960242867254162927605416228460108399087406989258037017639619195506711090012877454131383568832750606102901110782045529267940504471322847364808094790662696785470594892244716137203781890284216874035486302506042263453255580475380742959201314003788553692977914357996982118328587119124144181290753389394149235381045389696841471483947310663329993873046123134587149661347999774958105091103806375702387084149309542351541021140111048408248121408401601979108510758891595550054699719801708646232427198902271953673874 # 修正后的加密指数 e e = 7步骤 3:计算私钥 d 通过模逆运算计算 $d = e^{-1} \pmod{\phi(n)}$,其中 $\phi(n) = (p-1)(q-1)$: # 计算欧拉函数 phi(n) phi = (p - 1) * (q - 1) # 计算私钥 d d = invert(e, phi)步骤 4:解密得到中间值 m 通过模幂运算还原 $m = c^d \pmod{n}$: # 解密得到 m = flag^4 m = pow(c, d, n)步骤 5:高次根求解还原 Flag 由于 $m = \text{flag}^4$,需使用 iroot 函数对 m 求精确 4 次根: # 对 m 开 4 次方根,exact 表示是否为精确根 flag_num, exact = iroot(m, 4) if exact: # 将数字转换为字节流再解码为 UTF-8 字符串 try: # 计算字节长度并转换为大端序字节 flag_bytes = flag_num.to_bytes((flag_num.bit_length() + 7) // 8, 'big') flag = flag_bytes.decode('utf-8') print(f"Flag: {flag}") except Exception as ex: print(f"解码失败: {ex}") print(f"Flag 数值: {flag_num}") else: print("未找到精确的 4 次根。") print(f"m = {m}") print(f"iroot(m, 4) = {iroot(m, 4)}")三、解题结果 脚本运行后,成功求解出精确 4 次根,最终得到 Flag: Flag: flag{cfc48290383943a2cbf3c2d70db44690}四、核心知识点总结 1. RSA 解密关键避坑 指数修正:题目给出的 e=28 为干扰项,需通过数学验证确定真实加密指数(本题为 7) 大数运算:处理超过 Python 原生整数范围的大数时,必须使用 gmpy2 库,避免运算溢出或效率低下 2. 高次根求解原理 当明文经过 $k$ 次幂运算后再加密,解密后需对结果求 $k$ 次根 gmpy2.iroot(x, n) 函数返回元组 (root, exact),其中 exact 为布尔值表示是否为精确根,必须验证精确性,否则会得到错误结果 3. 数字转字符串规范 使用 int.to_bytes(length, byteorder, signed=False) 将大数转换为字节流 固定使用 byteorder='big'(大端序),符合 CTF 题目通用编码规范 解码时需捕获 UnicodeDecodeError,避免因编码格式错误导致脚本崩溃 五、完整运行脚本 from gmpy2 import invert, iroot # 已知参数 p = 134261118796789547851478407090640074022214132682000430136383795981942884853000826171189906102866323044078348933419038543719361923320694974970600426450755845839235949167391987970330836004768360774676424958554946699767582105556239177450470656065560178592346659948800891455240736405480828554486592172443394370831 q = 147847444534152128997546931602292266094740889347154192420554904651813340915744328104100065373294346723964356736436709934871741161328286944150242733445542228293036404657556168844723521815836689387184856871091025434896710605688594847400051686361372872763001355411405782508020591933546964183881743133374126947753 n = 19850163314401552502654477751795889962324360064924594948231168092741951675262933573691070993863763290962945190372400262526595224437463969238332927564085237271719298626877917792595603744433881409963046292095205686879015029586659384866719514948181682427744555313382838805740723664050846950001916332631397606277703888492927635867870538709596993987439225247816137975156657119509372023083507772730332482775258444611462771095896380644997011341265021719189098262072756342069189262188127428079017418048118345180074280858160934483114966968365184788420091050939327341754449300121493187658865378182447547202838325648863844192743 c = 13913396366755010607043477552577268277928241319101215381662331498046080625902831202486646020767568921881185124894960242867254162927605416228460108399087406989258037017639619195506711090012877454131383568832750606102901110782045529267940504471322847364808094790662696785470594892244716137203781890284216874035486302506042263453255580475380742959201314003788553692977914357996982118328587119124144181290753389394149235381045389696841471483947310663329993873046123134587149661347999774958105091103806375702387084149309542351541021140111048408248121408401601979108510758891595550054699719801708646232427198902271953673874 # 使用 e = 7(不是 28!) e = 7 # 计算私钥 d phi = (p - 1) * (q - 1) d = invert(e, phi) # 解密得到 m = flag^4 m = pow(c, d, n) # 对 m 开 4 次方根得到 flag flag_num, exact = iroot(m, 4) if exact: # 将数字转换为字符串 try: flag_bytes = flag_num.to_bytes((flag_num.bit_length() + 7) // 8, 'big') flag = flag_bytes.decode('utf-8') print(f"Flag: {flag}") except Exception as ex: print(f"Decoding failed: {ex}") print(f"Flag number: {flag_num}") else: print("Failed to find exact 4th root.") print(f"m = {m}") print(f"iroot(m, 4) = {iroot(m, 4)}") --- -
2023 宁波天一永安杯 MISC 进阶题解:PDF 隐写与 binwalk 分析实战 2023 宁波天一永安杯 MISC 进阶题解:PDF 隐写与 binwalk 分析实战 一、题目背景 赛事:宁波天一·永安杯 2023 题目类型:MISC(隐写术·PDF 隐写) 核心线索:图片文件 image.png 包含隐藏 PDF 数据 目标:从图片中提取隐写的 PDF 信息,解码得到 Flag 二、解题思路与核心分析 1. 初步检测:binwalk 挖掘隐藏数据 面对未知格式的图片文件,首先使用 binwalk 工具进行深度扫描,它能识别文件中隐藏的其他文件格式、压缩包或数据段,是隐写分析的第一步核心工具。 执行扫描命令: binwalk image.pngmo1d6wkz.png图片 扫描结果关键信息如下: 十进制(DECIMAL)十六进制(HEXADECIMAL)描述(DESCRIPTION)00x0PNG image, 1200 x 1200, 8-bit/color RGBA, non-interlaced1190x77Zlib compressed data, best compression666080x10430PDF document, version: "1.3"关键结论: 扫描结果明确显示,图片文件中隐藏了一个 版本为 1.3 的 PDF 文档,其起始偏移量为十六进制 0x10430(十进制 66608)。这说明 Flag 并非直接隐藏在图片 LSB 中,而是以 PDF 格式封装在图片尾部,属于复合格式隐写。 2. 数据提取:foremost 分离隐写文件 确定存在隐藏 PDF 后,使用 foremost 工具按文件格式分离数据。foremost 会根据扫描到的文件头/尾,自动提取独立的文件并保存。 执行提取命令: foremost image.png执行完成后,会在当前目录生成 output/ 文件夹,其中包含分离出的 PDF 文件(通常位于 output/pdf/ 目录下)。 3. 隐写验证:提取 PDF 为空白的原因分析 直接打开提取出的 PDF 文件,会发现显示为空白。这是 CTF 隐写题的常见套路: PDF 本身存在,但内容被加密/编码,或仅包含隐藏数据段 常规 PDF 阅读器无法直接读取其中的隐写信息,需要通过在线转换工具或专业脚本解码 4. 核心解码:PDF 转 TXT 提取 Flag 针对空白 PDF 的隐写场景,使用专业的 PDF 转 TXT 工具提取隐藏文本。这里选择在线工具 PDF24 Tools(https://tools.pdf24.org/zh/pdf-to-txt),操作流程如下: 打开上述在线工具,上传提取到的 PDF 文件 选择「PDF 转 TXT」功能,执行转换 下载转换后的 TXT 文件,打开即可看到隐藏的 Flag 解码结果: flag{625d7f13d1646c3ab86be95a6ee05dd9}三、核心技术知识点总结 1. 复合隐写的检测与处理 binwalk:万能文件格式分析工具,支持扫描图片/音频/视频中隐藏的任意格式文件(PDF/ZIP/EXE 等) foremost:文件分离工具,配合 binwalk 结果,可批量提取隐藏文件 适用场景:图片中隐藏文档、文档中隐藏图片、音频中隐藏压缩包等复合隐写场景 2. PDF 隐写的常见类型与解决方法 隐写类型特征解决方法空白 PDF 含隐写文本打开 PDF 无内容,仅含隐藏数据使用 PDF 转 TXT 工具提取文本PDF 加密打开提示输入密码尝试字典爆破(John the Ripper)、弱口令破解PDF 标签隐写文档正常,但元数据含 Flag查看 PDF 属性(元数据/注释)PDF 图层隐写仅底层可见,表层空白使用 Photoshop 等工具查看图层3. 常用隐写工具组合 工具类型工具名称适用场景扫描工具binwalk检测文件中隐藏的任意格式数据提取工具foremost按格式分离文件中的隐藏数据解码工具zsteg检测 PNG/BMP 图片的 LSB 隐写在线工具PDF24处理 PDF 隐写、格式转换四、完整解题命令与操作流程 1. 环境准备(Kali Linux) # 安装必要工具(若未安装) apt install binwalk foremost -y2. 核心操作步骤 # 1. 扫描图片中的隐藏数据 binwalk image.png # 2. 分离提取隐藏的 PDF 文件 foremost image.png # 3. 进入输出目录查看提取结果 cd output/pdf/ ls # 查看提取出的 PDF 文件(如 00000001.pdf)3. 在线解码操作 访问:https://tools.pdf24.org/zh/pdf-to-txt 上传 output/pdf/ 目录下的 PDF 文件 执行转换并下载 TXT 文件 打开 TXT 文件,复制其中的 Flag 五、最终 Flag flag{625d7f13d1646c3ab86be95a6ee05dd9}六、拓展与避坑指南 1. 避坑要点 若 foremost 提取的 PDF 仍为空,可尝试使用 binwalk -D 'pdf:application/pdf' image.png -O extracted_pdf/ 命令,精准提取 PDF 数据 在线工具解码失败时,可使用本地工具(如 pdftotext 命令)转换:pdftotext extracted_pdf/00000001.pdf output.txt,再查看 output.txt 2. 拓展学习 学习 binwalk 的高级用法:binwalk -E image.png 可视化文件结构、binwalk -dd "pdf" image.png 仅提取 PDF 了解其他隐写类型:图片 Steg 隐写、音频 LSB 隐写、文档元数据隐写等 -
2023 宁波天一永安杯 MISC - zip 题解:二进制字典爆破 ZIP 密码全流程 2023 宁波天一永安杯 MISC - zip 题解:二进制字典爆破 ZIP 密码全流程 一、题目背景 赛事:宁波天一·永安杯 2023 题目类型:MISC(压缩包爆破) 题目描述:flag{} 目标:破解加密 ZIP 压缩包密码,提取隐藏的 Flag 二、解题思路与过程 1. 题目分析 这是一道典型的 ZIP 压缩包密码爆破题。题目仅提供了一个加密的 ZIP 文件,没有任何额外提示。根据以往的 CTF 出题习惯,这类无提示的密码爆破题,密码大概率是短数字串、纯字母串,或是本题这种二进制(0/1)字符串。 2. 第一步:生成自定义二进制字典 我们推测密码是由 0 和 1 组成的二进制字符串,且长度不会太长。为了覆盖所有可能性,我们编写了一个 Python 脚本,生成长度从 1 到 9 的所有二进制组合,作为爆破字典。 import itertools def generate_binary_dict(max_length=9): """ 生成所有长度为1到max_length的二进制字符串 :param max_length: 二进制字符串的最大长度 :return: 包含所有组合的列表 """ dictionary = [] for length in range(1, max_length + 1): for combo in itertools.product(['0', '1'], repeat=length): dictionary.append(''.join(combo)) return dictionary def save_to_file(dictionary, filename='binary_dict.txt'): """ 将生成的字典保存到文件 :param dictionary: 二进制字符串列表 :param filename: 输出文件名 """ with open(filename, 'w') as f: for item in dictionary: f.write(f"{item}\n") print(f"字典已保存到 {filename}") if __name__ == "__main__": # 生成最大长度为9的二进制字典 binary_dict = generate_binary_dict(max_length=9) # 保存到文件 save_to_file(binary_dict)执行脚本后,会生成一个名为 binary_dict.txt 的字典文件,包含了从 0、1 到 111111111 的所有二进制组合。 3. 第二步:提取 ZIP 哈希值 在 Kali 环境中,我们使用 zip2john 工具从加密的 ZIP 文件中提取密码哈希值,以便后续使用 John the Ripper 进行爆破。 zip2john "/root/Desktop/zippwd.zip" > hash.txt执行后,哈希值被保存到了 hash.txt 文件中。 4. 第三步:使用 John the Ripper 爆破密码 John the Ripper 是一款强大的密码破解工具,我们使用它配合刚才生成的二进制字典进行爆破。 john --wordlist=/root/Desktop/binary_dict.txt hash.txt工具很快就成功破解出了密码,再次执行 john --show 查看结果: john --show hash.txt输出结果如下: zippwd.zip/flag.txt:01001100:flag.txt:zippwd.zip:/root/Desktop/zippwd.zipmo1d1wht.png图片 可以看到,ZIP 包内 flag.txt 文件的密码为 01001100。 5. 第四步:解压文件获取 Flag 使用破解出的密码解压 ZIP 文件,即可得到 flag.txt,里面就是最终的 Flag。 三、知识点总结 ZIP 爆破工具链 zip2john:提取 ZIP 文件的密码哈希。 john:基于字典的密码爆破工具,支持多种哈希算法。 fcrackzip:另一款常用的 ZIP 爆破工具,命令为 fcrackzip -D -p binary_dict.txt -u zippwd.zip,可作为备选方案。 自定义字典生成技巧 当题目提示很少时,优先尝试简单规则字典:纯数字、纯字母、二进制、键盘顺序、生日格式等。 Python 的 itertools.product 是生成全组合字典的神器,可根据题目需求灵活修改字符集和长度。 常见爆破失败原因排查 字典文件格式问题:确保字典每行只有一个密码,无多余空格或换行符。 路径问题:爆破时需确保 ZIP 文件和字典文件路径正确,避免 No such file or directory 错误。 密码长度:如果爆破失败,可以尝试增加字典的最大长度,比如将 max_length 设为 10 或 12。 四、完整解题命令集合 # 1. 生成二进制字典(执行上面的Python脚本) python3 binary_dict.py # 2. 提取ZIP哈希 zip2john zippwd.zip > hash.txt # 3. 使用john进行爆破 john --wordlist=binary_dict.txt hash.txt # 4. 查看爆破结果 john --show hash.txt # 5. 解压文件(使用破解出的密码) unzip -P 01001100 zippwd.zip五、最终 Flag (解压后即可得到题目要求的 flag{} 格式 Flag)