如何逆向破解攻防世界CatFly题目?

摘要:一、题目背景与核心目标 1. 题目基础信息 类型:Linux 平台逆向工程(RE)题,可执行程序无输入,仅输出滚动乱码和递增次数字符串; 现象:运行程序后,顶部是乱码(加密 Flag),底部循环输出 You have nyaned for
一、题目背景与核心目标 1. 题目基础信息 类型:Linux 平台逆向工程(RE)题,可执行程序无输入,仅输出滚动乱码和递增次数字符串; 现象:运行程序后,顶部是乱码(加密 Flag),底部循环输出 You have nyaned for X times!(X 从 0 开始递增); 核心目标:通过逆向分析程序逻辑,还原加密乱码对应的原始 Flag。 2. 逆向解题核心思路(通用) 二、阶段 1:程序初分析 —— 从现象提取线索(逆向第一步) 1. 运行程序,收集直观线索 操作步骤: 给程序加执行权限:chmod +x CatFly; 运行程序:./CatFly; 记录现象: 线索 1:乱码随次数 X 递增同步变化 → 乱码生成依赖 X; 线索 2:X 从 0 开始递增 → 次数变量有明确初始值; 线索 3:无输入仅输出 → Flag 加密逻辑在程序内部,无需外部输入参与。 逆向知识点:先运行后分析,避免直接陷入汇编代码,用现象缩小分析范围。 2. IDA 静态分析准备 操作步骤: 用 IDA Pro 打开程序(64 位 Linux 程序选「ELF64 for x86-64」); 等待 IDA 完成反汇编,按F5生成 main 函数伪代码(核心); 打开字符串窗口(Shift+F12),搜索关键词: 找到 You have nyaned for %d times! → 关联次数 X; 找到潜在的 CatCTF → Flag 前缀(后续验证用)。 逆向知识点: IDA 核心快捷键:F5(伪代码)、Shift+F12(字符串窗口)、X(交叉引用); 字符串窗口是逆向 “捷径”,Flag 前缀、提示语常藏于此。 三、阶段 2:核心逻辑拆解 ——IDA 分析关键变量与函数 1. 关键变量定位与分析(逆向核心) (1)次数变量:dword_108E0(对应 X) 定位步骤: 在字符串窗口右键 You have nyaned for %d times! → 「Jump to cross reference」→ 跳转到 printf 调用处; 伪代码中%d对应的参数就是dword_108E0; 右键dword_108E0 → 「Jump to operand」→ 跳转到.bss段定义处: .bss:00000000000108E0 dword_108E0 dd ? 分析结论: dword_108E0是.bss段全局变量(未初始化数据段); 按 C 语言规则:未显式初始化的全局整数变量默认值为 0 → X 初始值 = 0。 逆向知识点:.bss段变量dd ?表示未显式初始化,全局变量默认值为 0;变量名 = 类型(dword)+ 地址后几位(108E0)是 IDA 命名习惯。 (2)种子变量:dword_E1E8(随机数种子) 定位步骤: 在 main 函数伪代码中搜索「随机数」相关逻辑(或异或^操作); 找到调用sub_62B5(随机数生成函数)的地方,参数 / 返回值关联dword_E1E8; 右键dword_E1E8 → 「Find cross references to」→ 找到初始化处:dword_E1E8 = 0x1106。 分析结论:dword_E1E8是随机数种子,初始值 = 0x1106,每次循环后会被更新。 (3)加密数组:e120(存储加密 Flag) 定位步骤: 在伪代码中找到异或操作(^),操作数之一就是e120数组; 右键e120 → 「Jump to operand」→ 跳转到.data段定义处(已初始化数据段): .data:000000000001E120 dword_E120 dd 27FBh, 27A4h, 464Eh, ... 分析结论:e120是 dword 数组(每个元素 4 字节),存储加密后的 Flag 原始数据,解密需提取其有效字节。 逆向知识点:.data段存储已初始化全局变量,数组、常量常在此处。
阅读全文