[NSSCTF 2025 秋招赛] 花指令
题目信息
题目名称:NSSCTF 2025 秋招赛 · 花指令
题目类型:Reverse Engineering
难度评估:入门
解题过程
第一步:基础分析
先用 DIE 看一下,样本是 32 位 PE,可确认未加壳,直接用 IDA 静态分析足够。
第二步:主流程梳理
在 IDA 中按 F5 查看伪代码,可以看到 main 读取输入后把它平均切成三段,再分别传入 flower_1、flower_2、flower_3 做校验:
1 | int __cdecl main(void) { |
第三步:清除花指令
进入 flower_x 系列函数可以发现大量成对出现的 jz / jnz、xor eax, eax + jz 等典型花指令。方法很固定:
- 在反汇编窗口按
U取消伪代码还原; - 把干扰跳转改成
NOP或直接改为jmp; - 重新按
C识别指令,流程就顺回来了。
处理完花指令之后,三个函数的核心逻辑变得很清晰:都在使用同一个密钥对输入做异或校验。
1 | int __cdecl flower_2(char *a) { |
flower_1 与 flower_3 的写法完全相同,只是常量数组不同。
第四步:脚本复现
把三个数组和密钥抄出来,写个脚本按位异或即可还原 flag:
1 | answer1 = [0x0d, 0x3a, 0x32, 0x2f, 0x38, 0x29, 0x38, 0x5d, 0x56, 0x58, 0x5e, 0x09, 0x21, 0x0d] |
第五步:验证结果
脚本输出的结果为 NSSCTF{4742fbde-f200-4c19-a9d5-8d916130d5a2},与题目给出的 flag 完全一致。
总结
- 识别并清理
jz/jnz、xor reg, reg+jz这类花指令是关键; - 去除干扰后三个函数实质上是相同的异或校验;
- 通过脚本复现校验过程可以快速确认 flag,后续遇到类似题型也可以参照此流程。

