BUUCTF SimpleRev:逆向工程中的字符变换算法解析
1. 逆向分析入门从SimpleRev看CTF题目设计第一次接触BUUCTF的SimpleRev题目时我完全被它精巧的设计吸引了。这道题表面看起来是个简单的字符处理程序但深入分析后会发现其中蕴含着典型的CTF逆向工程考点。我们先来看看这个程序的基本行为运行后会提示输入d/D开始或q/Q退出选择开始后进入Decry函数要求用户输入flag并进行验证。逆向工程中最关键的是理解程序的数据流。在SimpleRev中有几个关键变量需要注意key1和key3是硬编码在程序中的字符串src和v9这两个变量需要特别注意字节序问题text变量由key3和v9拼接而成key变量由key1和src拼接而成我在分析时犯过一个典型错误直接看IDA反编译的伪代码忽略了数据存储方式。src和v9在内存中是以整型形式存储的需要右键转换为char数组才能看到实际字符串内容。更坑的是这里还涉及大小端问题字符串需要手动反转才能得到正确值。比如src显示为SLCDN实际应该是NDCLS。2. 深入解析字符变换算法2.1 密钥预处理过程程序首先会对key进行预处理这个过程很有意思for ( i 0; i key_len; i ) { if ( key[key_p % key_len] 64 key[key_p % key_len] 90 ) { key[i] key[key_p % key_len] 32; } key_p; }这段代码的作用是将key中的所有大写字母转换为小写。但实现方式很特别它使用key_p % key_len来循环遍历key而不是直接使用循环变量i。这种写法在CTF题目中很常见目的是增加一点分析难度。我实际调试时发现经过预处理后key从ADSFKNDCLS变成了adsfkndcls。这个细节很重要因为后续的加密算法会用到处理后的key。2.2 核心加密算法剖析真正的加密逻辑在用户输入处理部分if ( input 96 || input 122 ) { if ( input 64 input 90 ) { str2[input_not_return_cnt] (input - 39 - key[key_p % key_len] 97) % 26 97; key_p; } } else { str2[input_not_return_cnt] (input - 39 - key[key_p % key_len] 97) % 26 97; key_p; }这个算法有几个特点同时处理大小写输入但处理方式相同使用key循环对输入字符进行变换变换公式为(input - 39 - key_char 97) % 26 97每处理一个非空格字符key_p递增我花了些时间推导这个公式的实际含义。经过多次测试发现它本质上是一种基于字母表的位移加密类似于凯撒密码但更复杂。公式中的-39和97看似随意实际上是为了将ASCII码调整到0-25范围内进行模运算。3. 逆向破解实战从静态分析到动态验证3.1 关键数据提取要破解这个加密首先需要获取所有必要的数据text killshadow这是目标输出key adsfkndcls预处理后的密钥加密算法已知在IDA中查找这些字符串时要注意字符串可能被拆分成多个部分。比如key1是ADSFKkey3是kills而v9是hadow需要反转字节序。3.2 枚举破解的实现由于加密算法是可逆的我们可以尝试枚举所有可能的输入for (int i 0; i 10; i) { for (int j 0; j 26; j) { char put A j; if (text[i] (put - 39 - key[i % key_len] 97) % 26 97) { cout put; break; } } }这个枚举算法尝试每个位置的大写字母A-Z检查加密后是否匹配目标text中的对应字符。我最初尝试同时枚举大小写但发现只有大写字母能得到有意义的flag。在实际测试中我发现当输入为KLDQCUDFZO时加密结果正好是killshadow。这就是我们要找的flag。有趣的是如果尝试小写字母组合虽然也能得到一些结果但不符合题目要求。4. 经验总结与技巧分享逆向工程中最耗时的往往不是算法分析而是数据提取和预处理。在SimpleRev这道题中我踩过几个坑字节序问题src和v9的整型表示需要转换为正确的字符串形式。我一开始忽略了这点导致后续分析完全错误。密钥预处理没注意到程序会修改key的内容直接用原始key进行解密尝试自然得不到正确结果。枚举范围最初同时枚举大小写导致结果不唯一。后来发现题目预期flag是全大写的才缩小了枚举范围。对于类似的题目我建议仔细检查所有数据提取是否正确动态调试验证静态分析结果注意题目给出的暗示如flag格式要求从简单情况开始测试如不加空格逆向工程就像解谜需要耐心和系统性的方法。SimpleRev虽然名字简单但包含了许多典型的逆向考点是非常好的练习题目。