从加密7z到隐藏图片:一次完整的CTF数字取证实战解析

张开发
2026/5/12 23:46:28 15 分钟阅读
从加密7z到隐藏图片:一次完整的CTF数字取证实战解析
1. 从加密7z到隐藏图片的技术挑战第一次拿到这个CTF题目时我盯着那个加密的7z压缩包和损坏的图片文件看了好久。这就像侦探小说里的双重谜题——不仅要破解压缩包的密码还得从看似乱码的图片中还原出隐藏信息。这种数字取证挑战在现实世界的网络安全调查中其实很常见比如分析恶意软件样本或恢复被破坏的数字证据。题目给出了两个关键文件password.7z和flag1.txt。flag1.txt实际上是个伪装成文本文件的7z压缩包这种文件伪装手法在CTF比赛中相当典型。我习惯性地先用file命令检查文件类型果然发现flag1.txt的真实身份是7z压缩包。改后缀后得到了第二个加密压缩包flag.7z这就形成了一个有趣的压缩包套娃结构。这种设计思路很巧妙第一层密码破解后得到第二层的线索而最终的flag可能藏在图片的像素数据中。要完成这个挑战我们需要串联使用多种技术7z哈希提取与密码爆破Python脚本逆向分析图像处理与矩阵还原随机种子破解2. 7z压缩包的密码破解实战2.1 提取7z哈希值传统的压缩包破解工具如PackageCrack经常遇到兼容性问题我更喜欢使用John the Ripper的7z2john.pl脚本。这个Perl脚本需要Strawberry Perl环境支持安装过程可能会遇到路径问题。我在Windows下测试时发现必须将Perl添加到系统PATH才能正常执行脚本。提取哈希值的命令很简单perl 7z2john.pl password.7z hash.txt但实际操作中可能会遇到两个坑脚本执行权限问题Linux/Mac需要chmod xPerl模块缺失报错需要安装Crypt::ECB等依赖得到的哈希值格式如下$7z$2$19$0$$16$abc477f84f711f5530432e64418c8392$3167568243$16$12$40a31f0f88ac7b9a9acdc6cbb7d23f23$8$00这个字符串包含了7z加密使用的算法版本、盐值、迭代次数等关键参数是后续破解的基础。2.2 Hashcat掩码攻击配置根据题目提示密码是6-8位纯数字这大大缩小了破解范围。Hashcat作为GPU加速的密码恢复工具比传统CPU工具快几个数量级。我的RTX 3090显卡在破解6位数字密码时只需要几秒钟。关键参数配置hashcat -m 11600 -a 3 hash.txt ?d?d?d?d?d?d -O -w 3 -o result.txt参数详解-m 11600指定7z压缩包哈希类型-a 3使用掩码攻击模式?d表示数字字符(0-9)-O启用优化加速-w 3平衡功耗与性能实际测试中发现8位数字密码的破解时间会指数级增长。如果密码复杂度更高可以考虑使用字典攻击(-a 0)配合常见密码字典组合掩码攻击(?d?l表示数字小写字母)分布式破解(多个GPU协同工作)3. 图片隐写与矩阵还原技术3.1 加密脚本逆向分析解压flag.7z后得到challenge.png和encode.py这个Python脚本揭示了图片的加密逻辑。核心加密步骤分为三部分随机种子设定i random.randint(520,540) np.random.seed(i)这里使用了520-540之间的随机数作为伪随机数生成器的种子。虽然叫随机但只要种子相同生成的随机序列就完全一致。像素矩阵扰乱for i in range(to_hide_array.shape[0]): np.random.shuffle(to_hide_array[i])这个循环对图像的每一行像素进行独立打乱。由于使用了固定种子打乱模式是可预测的。灰度图转换gray cv2.cvtColor(to_hide_array, cv2.COLOR_BGR2GRAY) cv2.imwrite(challenge.png, gray)最终将打乱后的彩色图像转为灰度图保存这步操作实际上丢失了颜色信息但保留了亮度值。3.2 逆向还原算法设计解密的关键在于重建原始像素顺序。由于知道随机种子范围(520-540)可以采用暴力穷举的方式尝试所有可能。我的解密脚本核心逻辑是创建与加密图像相同尺寸的索引矩阵tmp [list(range(to_hide_array.shape[1]))]*to_hide_array.shape[0] tmp np.asarray(tmp)用相同种子重现shuffle过程for i in range(to_hide_array.shape[0]): np.random.shuffle(tmp[i])根据shuffle后的索引重建原始图像for i in range(to_hide_array.shape[0]): for j in range(to_hide_array.shape[1]): re[i][tmp[i][j]]to_hide_array[i][j]这个方法的巧妙之处在于tmp矩阵记录了每个像素被移动到的位置相当于一张路线图。通过逆向追踪就能把像素放回原位。4. 完整解题流程与排错经验4.1 分步操作指南第一层破解用7z2john提取password.7z的哈希Hashcat爆破6位数字密码(得到321456)解压获得password.txt第二层破解从password.txt获取flag.7z密码(7324623c)解压得到challenge.png和encode.py图片还原分析encode.py理解加密逻辑编写decode.py尝试520-540所有种子检查生成的21张图片找到flag4.2 常见问题排查在实际操作中可能会遇到这些问题哈希提取失败确保使用正确版本的7z2john脚本检查Perl环境变量配置验证7z文件完整性(可能被故意损坏)Hashcat无法识别GPU安装最新显卡驱动使用--force参数跳过警告降低工作负载(-w 2)图片还原效果异常确认OpenCV版本一致(不同版本色彩空间处理有差异)检查numpy数组维度(三维彩色vs二维灰度)验证随机数生成范围(包括边界值540)4.3 性能优化技巧当处理更大尺寸的图片或更广的种子范围时可以考虑这些优化并行处理from multiprocessing import Pool def decode_wrapper(sd): decode(sd, challenge.png) with Pool(8) as p: p.map(decode_wrapper, range(520,541))内存优化使用np.empty替代np.zeros初始化大数组及时del不再使用的变量分块处理超大图像提前终止添加自动flag检测逻辑使用OCR识别还原图像中的文字设置相似度阈值自动判断还原效果这套技术栈不仅适用于CTF比赛在数字取证、安全研究等领域都有广泛应用。比如分析恶意软件时经常需要处理被混淆的配置数据或加密的通信内容。掌握这些基础技能后可以进一步学习更复杂的加密算法分析和逆向工程技术。

更多文章