"Come_on"是海软25校赛CTF逆向工程类的一道典型题目,这类题目通常考察参赛者对程序反编译、代码分析和逻辑推理的综合能力。作为逆向工程方向的入门级题目,它主要测试选手对基础逆向工具的使用和对简单加密算法的识别能力。
这道题目的名称"Come_on"本身就带有一定的提示性,可能暗示着题目中存在着需要"继续"或"深入"分析的逻辑。根据我的参赛经验,这类命名风格的题目往往在表面逻辑之下隐藏着关键判断条件或flag生成算法。
对于这类CTF逆向题目,我通常会准备以下工具链:
提示:新手建议从Ghidra开始,它是免费开源的逆向工具,功能强大且社区支持良好。对于这道题目,Ghidra的基本功能已经完全够用。
首先对题目文件进行基础分析:
bash复制file Come_on
strings Come_on | less
通过文件命令可以确认这是一个32位ELF可执行文件(假设题目提供的是Linux平台二进制)。使用strings命令快速扫描可打印字符串,可能会发现一些关键提示或flag相关的字符串片段。
使用Ghidra加载程序后,定位到main函数。典型的CTF逆向题目main函数结构通常包含:
在反编译视图中,我们可能会看到类似这样的伪代码结构:
c复制void main(void) {
char input[32];
printf("Give me the flag:");
scanf("%31s",input);
if (check(input)) {
puts("Correct!");
} else {
puts("Wrong!");
}
return;
}
真正的挑战通常隐藏在check函数或类似的验证逻辑中。在这个"Come_on"题目中,验证函数可能包含:
在逆向过程中,需要特别关注以下类型的代码模式:
使用gdb进行动态调试的基本步骤:
bash复制gdb ./Come_on
(gdb) break main
(gdb) run
(gdb) ni/si # 单步执行
(gdb) info registers # 查看寄存器值
(gdb) x/s $eax # 查看内存中的字符串
在分析验证逻辑时,需要在以下位置设置断点:
例如:
bash复制(gdb) break *0x08048523 # 在关键比较指令处设断点
(gdb) commands # 断点触发时自动执行命令
>print $eax
>print $ebx
>continue
>end
在CTF逆向题中,常见的简单加密包括:
在反编译代码中,这些算法通常表现为:
c复制input[i] = input[i] + 3;
c复制input[i] = input[i] ^ 0x55;
c复制input[i] = (input[i] * 2) - 1;
假设通过静态分析,我们发现关键验证函数如下:
c复制bool check(char *input) {
if (strlen(input) != 12) return false;
for (int i = 0; i < 12; i++) {
if ((input[i] ^ 0x55) != secret[i]) {
return false;
}
}
return true;
}
其中secret是程序中的一个全局数组:
c复制char secret[] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c};
使用Python编写解密脚本:
python复制secret = [0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c]
flag = ''.join([chr(c ^ 0x55) for c in secret])
print(flag)
执行后将输出正确的flag字符串。
有些题目会使用反调试技术,常见检测方法包括:
应对措施:
bash复制(gdb) set disable-randomization on
(gdb) handle SIGTRAP nostop
(gdb) catch syscall ptrace
对于复杂题目,可以编写IDAPython或Ghidra脚本自动化分析:
python复制# IDAPython示例:查找所有xor指令
for addr in idautils.Functions():
func = idaapi.get_func(addr)
for insn in idautils.FuncItems(func.startEA):
if idaapi.is_code(idaapi.get_flags(insn)):
if idaapi.print_insn_mnem(insn) == "xor":
print("Found XOR at: 0x%x" % insn)
可能原因:
解决方案:
bash复制# 安装32位兼容库
sudo apt install gcc-multilib
# 使用LD_PRELOAD注入
LD_PRELOAD=./libc.so ./Come_on
Ghidra/IDA有时会产生错误的伪代码,这时需要:
在实际比赛中,逆向题目往往时间紧迫,我的策略是:
对于这道"Come_on"题目,关键是要快速识别出XOR加密模式。经验告诉我,当看到字符数组与固定值进行异或操作时,很可能是简单的单字节XOR加密,这种模式在CTF入门题中非常常见。
另一个实用技巧是:在Ghidra中,可以重命名变量和函数,添加注释来标记已分析出的逻辑,这能显著提高后续分析效率。比如将var1重命名为user_input,将var2重命名为secret_key等。