1. 题目背景与初步分析
今天我们来拆解一个经典的CTF逆向工程题目——"love"。这个题目来自BugKu平台,属于典型的输入验证类逆向题。题目提供了一个32位的Windows可执行文件,运行后会提示用户输入flag,如果输入错误程序会直接退出。
作为逆向工程师,我们的任务是通过静态分析和动态调试,理解程序的验证逻辑,找出正确的flag。这类题目在CTF比赛中非常常见,考察的是对程序逻辑的逆向分析能力和编码转换的理解。
首先用Exeinfo PE工具检查文件基本信息,确认这是一个32位Windows程序,没有加壳保护。这意味着我们可以直接使用IDA Pro等静态分析工具进行反编译。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 程序主逻辑分析
2.1 主函数定位与反编译
使用IDA Pro打开程序后,首先在函数窗口(快捷键Ctrl+F)搜索main函数。在Windows平台下,32位程序的入口函数通常命名为_main或_main_0。找到_main_0函数后,按F5生成伪代码,这是逆向分析的关键一步。
主函数逻辑清晰可见:
- 打印提示信息"Please input the flag:"
- 读取用户输入到str变量
- 计算输入长度
- 调用sub_4110BE函数处理用户输入
- 对处理后的字符串进行逐字符变换
- 将结果与内置字符串"e3nifIH9b_C@n@dH"比较
2.2 关键处理函数分析
sub_4110BE函数实际上只是一个包装函数,它内部调用了真正的处理函数sub_411AB0。深入分析sub_411AB0后发现,这个函数实现了自定义的Base64编码逻辑。
有趣的是,虽然程序使用了自定义的Base64编码表,但实际查看编码表内容后发现,它与标准Base64编码表完全一致。这可能出题者设置的"障眼法",目的是增加逆向难度。
3. 逆向算法解析
3.1 编码变换流程
程序对用户输入的处理分为两个主要步骤:
- 使用标准Base64编码表对输入进行编码
- 对编码后的每个字符执行ASCII值+下标j的变换
具体来说,假设用户输入为flag,经过Base64编码后得到字符串S,然后对S的每个字符S[j]执行:
code复制S[j] = S[j] + j
最后将变换后的字符串与硬编码值"e3nifIH9
