如何逆向破解攻防世界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段存储已初始化全局变量,数组、常量常在此处。
