BUUCTF逆向分析:异或加密与脚本破解实战
1. 异或加密原理与逆向分析基础异或运算在逆向工程中就像一把双刃剑它既是常见的加密手段也是容易被忽视的突破口。我第一次接触异或加密是在分析某个游戏的存档文件时发现数据看起来毫无规律但用十六进制编辑器查看时又隐约感觉有某种模式。后来才明白这就是典型的异或加密特征。异或运算的本质是对二进制位进行按位比较相同为0不同为1。比如数字5二进制0101和数字3二进制0011异或的结果是6二进制0110。这个特性带来了两个重要性质自反性A ^ B ^ B A可逆性如果C A ^ B那么A C ^ B在实际逆向分析中我们常看到两种异或应用场景固定密钥异或所有数据与同一个密钥字节进行异或滚动异或数据与前一个字节或位置索引进行异或BUUCTF这道题目就采用了第二种方式它要求输入33个字符的字符串然后从第二个字符开始每个字符都与前一个字符进行异或。这种加密方式看似简单但如果不知道加密逻辑逆向起来会相当困难。2. 题目分析与关键数据提取用IDA Pro打开题目提供的二进制文件时我习惯先用Strings窗口快速扫描可疑字符串。这道题目的提示很明显直接能看到Input your flag:和Success、Failed这样的关键字符串。定位到main函数后F5反编译的伪代码显示出了完整的校验逻辑。关键代码段是这样的for ( i 1; i 33; i ) v6[i] ^ v6[i - 1]; if ( !strncmp(v6, global, 0x21uLL) ) printf(Success);这段代码告诉我们三个重要信息输入长度必须为33字节包括末尾的null终止符加密过程是滚动异或最终比较的目标数据存储在global变量中提取global数据是逆向的关键步骤。在IDA中可以通过ShiftE导出数据得到十六进制数组[0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11, 0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F, 0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F, 0x47, 0x32, 0x4F, 0x00]3. 逆向脚本编写与解密过程理解了加密逻辑后解密脚本的编写就水到渠成了。由于异或的自反性解密过程其实就是加密过程的逆向。具体思路是第一个字符保持不变因为它没有被加密从第二个字符开始每个字符都与前一个密文字符异或这里有个坑我踩过Python中十六进制数默认是int类型需要先转为字符再异或或者保持整数形式异或后再转字符。我推荐后者因为处理起来更直观。解密脚本的核心部分encrypted [0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11, 0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F, 0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F, 0x47, 0x32, 0x4F, 0x00] flag chr(encrypted[0]) # 第一个字符直接保留 for i in range(1, len(encrypted)-1): # 最后一个是null终止符 flag chr(encrypted[i] ^ encrypted[i-1]) print(flag)运行后会得到flagflag{QianQiuWanDai_YiTongJiangHu}。这个结果验证了我们的逆向思路是正确的。4. 常见问题与调试技巧在实际操作中可能会遇到几个典型问题问题1异或顺序错误新手常犯的错误是搞错异或方向。记住加密时的顺序是current ^ previous那么解密时也应该是current ^ previous而不是反过来。问题2忽略数据长度题目明确要求33字节长度但导出数据时可能会漏掉最后的null字节。我在第一次尝试时就因为少算了一个字节导致最后几个字符解密错误。问题3编码问题如果flag中包含非ASCII字符Python2和Python3的处理方式不同。建议统一使用Python3并在脚本开头加上编码声明# -*- coding: utf-8 -*-调试时可以分段验证先验证第一个字符是否正确然后验证前5个字符的解密结果最后处理完整数据还可以添加中间输出帮助调试for i in range(1, len(encrypted)-1): decrypted encrypted[i] ^ encrypted[i-1] print(fStep {i}: {encrypted[i]:02X} ^ {encrypted[i-1]:02X} {decrypted:02X} - {chr(decrypted)}) flag chr(decrypted)5. 异或加密的变种与防护这道题目展示的是最简单的滚动异或实际比赛中可能会遇到更复杂的变种多字节滚动异或不是与前一个字节异或而是前N个字节混合异或结合固定密钥和滚动异或异或后移位异或后再进行位移操作防护这类逆向分析的方法包括隐藏关键字符串如Success增加虚假的比较操作将异或操作拆分成多个函数结合其他加密算法我曾遇到过一道CTF题它不仅在异或前对数据进行了位移还使用了动态生成的密钥。解决这类题目需要耐心地动态调试逐步理清加密逻辑。6. 扩展练习与学习资源想要真正掌握异或加密的逆向技巧光看理论是不够的。我推荐以下几个练习方向BUUCTF其他异或题目简单异或混合加密动态异或实际应用分析分析旧版软件注册算法游戏存档文件解密网络协议逆向进阶工具使用IDA Python脚本自动化分析x64dbg动态调试使用CyberChef快速验证异或结果我刚开始学习逆向时花了整整一周时间研究各种异或变种。后来发现无论形式怎么变化核心原理都是相通的。建议从简单题目入手逐步增加难度同时养成做笔记的习惯记录每种异或模式的特征和解法。