最新发布
-
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) -
永安杯MISC类型题目BeautifulImage 2023年宁波天一永安杯MISC类型题目BeautifulImage 解题全过程 一、题目背景 赛事:宁波天一·永安杯 2023 题目类型:MISC(隐写术) 题目描述:Cool Mountain flag{} 目标:从图片中提取隐藏的 Flag 二、解题思路与过程 1. 工具选择:Zsteg Zsteg 是一款专门针对 PNG/BMP 格式图片的隐写检测工具,能快速提取 LSB(最低有效位)隐写、通道数据等信息,是这类题目的首选工具。 2. 第一步:Zsteg 扫描图片 将下载的图片命名为 alps.png,在 Kali 环境中执行扫描: zsteg /root/Desktop/alps.png输出结果: b1,r,lsb,xy .. text: "Xv59 VX^D~\\99" b1,rgb,lsb,xy .. text: "ZmxhZ3syNGVkZDc2ZTQ2YzIyYzY1Y2M1YmRkZDNjNmU0ZjZmM30=" b1,bgr,lsb,xy .. /var/lib/gems/3.1.0/gems/zsteg-0.2.13/lib/zsteg/checker/wbstego.rb:41:in `to_s': stack level too deep (SystemStackError) from /var/lib/gems/3.1.0/gems/iostruct-0.5.0/lib/iostruct.rb:180:in `inspect' ... 10066 levels...这里我们重点关注 b1,rgb,lsb,xy 通道的输出,它是一段标准的 Base64 编码字符串: ZmxhZ3syNGVkZDc2ZTQ2YzIyYzY1Y2M1YmRkZDNjNmU0ZjZmM30= 补充说明:b1,bgr,lsb,xy 报错是 Zsteg 的一个常见问题,不影响我们获取有效信息,可以直接忽略。 mo1cor45.png图片3. 第二步:Base64 解码获取 Flag 使用 base64 -d 命令对字符串进行解码: echo "ZmxhZ3syNGVkZDc2ZTQ2YzIyYzY1Y2M1YmRkZDNjNmU0ZjZmM30=" | base64 -d解码结果: flag{24edd76e46c22c65cc5bddd3c6e4f6f3}和题目描述中的 Cool Mountain flag{} 格式完全匹配,解题完成。 三、知识点总结 Zsteg 工具核心用法 基础扫描:zsteg 图片名.png 查看指定通道数据:zsteg -a 图片名.png -v 提取特定通道数据:zsteg -E b1,rgb,lsb,xy 图片名.png > output.txt 常见隐写编码格式 很多隐写题目会将 Flag 用 Base64/URL/HEX 等方式编码后隐藏在图片中,遇到乱码类的字符串,优先尝试 Base64 解码。 Zsteg 报错处理 stack level too deep 这类错误一般是工具内部的 wbstego 模块栈溢出导致,和图片本身无关,不影响其他通道的扫描结果,直接跳过即可。 四、完整解题命令集合 # 1. 扫描图片隐写信息 zsteg /root/Desktop/alps.png # 2. 提取指定通道数据(可选,当输出过长时使用) zsteg -E b1,rgb,lsb,xy alps.png > base64_flag.txt # 3. Base64 解码 cat base64_flag.txt | base64 -d # 或直接解码字符串 echo "ZmxhZ3syNGVkZDc2ZTQ2YzIyYzY1Y2M1YmRkZDNjNmU0ZjZmM30=" | base64 -d五、最终 Flag flag{24edd76e46c22c65cc5bddd3c6e4f6f3}