"Come_on"是海软25校赛CTF逆向工程类的一道典型题目,考察参赛者对PE文件结构、基础反调试技巧以及简单算法逆向的能力。这类题目通常会给参赛者一个Windows可执行文件,要求通过逆向分析找到隐藏的flag或通过特定验证流程。
作为CTF逆向方向的入门级题目,"Come_on"不需要复杂的工具链,用基础的IDA Pro配合x32dbg就能完成全部分析。但题目设计者往往会设置一些"小障碍"来考验选手的基础知识扎实程度,比如故意修改PE头信息、插入无效代码混淆等。
拿到题目文件后,我首先用Detect It Easy工具进行基础检测:
code复制文件类型: PE32 executable (GUI) Intel 80386
编译器: Microsoft Visual C++ 2010
熵值: 6.8 (未加壳)
关键信息显示这是一个32位的Windows GUI程序,使用VC++2010编译,且没有进行加壳处理。熵值在合理范围内,基本可以排除压缩壳或加密壳的可能性。
直接运行程序会出现一个简单的对话框:
code复制标题: CrackMe
内容: Please input your flag:
输入任意字符点击确认后会立即退出,没有任何提示信息。这种"静默失败"的行为在逆向题中很常见,通常意味着程序内部有主动退出的反调试代码。
将文件载入IDA后,首先查看字符串窗口发现几个关键字符串:
code复制.rdata:00403000 "Please input your flag:"
.rdata:00403018 "Congratulation!"
.rdata:00403028 "Try again..."
交叉引用定位到主要逻辑函数sub_401000,其流程图显示典型的输入验证结构:
在sub_4011A0函数中发现核心校验算法:
c复制for ( i = 0; i < 24; ++i ) {
if ( (input[i] ^ 0x55) != encoded_data[i] )
return 0;
}
其中encoded_data是硬编码在.data段的一组字节:
code复制.data:00405000 db 34h, 57h, 0C4h, 0DFh, 0A7h, 0D3h, 49h, 0C2h
.data:00405008 db 0D5h, 0F2h, 4, 0A1h, 0E9h, 0E9h, 0B5h, 25h
.data:00405010 db 0F5h, 0E1h, 0C1h, 0D1h, 26h, 0A5h, 0D3h, 93h
这是一个典型的异或加密算法,每个输入字符与0x55异或后与预置数据比对。逆向计算flag的Python脚本如下:
python复制encoded = [0x34,0x57,0xC4,0xDF,0xA7,0xD3,0x49,0xC2,
0xD5,0xF2,0x04,0xA1,0xE9,0xE9,0xB5,0x25,
0xF5,0xE1,0xC1,0xD1,0x26,0xA5,0xD3,0x93]
flag = ''.join([chr(c ^ 0x55) for c in encoded])
print(flag)
虽然本题没有强力的反调试措施,但在sub_401050中发现了IsDebuggerPresent检查:
asm复制call ds:IsDebuggerPresent
test eax, eax
jnz short loc_40107D ; 直接退出
在x32dbg中可以通过以下方式绕过:
xor eax,eax; ret在验证函数入口设置断点:
code复制bp 004011A0
运行后输入测试字符串"AAAAAAAAAAAAAAAAAAAAAAAA",观察栈帧可以发现:
结合静态和动态分析结果,最终解题脚本如下:
python复制def decode_flag():
encoded = [
0x34,0x57,0xC4,0xDF,0xA7,0xD3,0x49,0xC2,
0xD5,0xF2,0x04,0xA1,0xE9,0xE9,0xB5,0x25,
0xF5,0xE1,0xC1,0xD1,0x26,0xA5,0xD3,0x93
]
return ''.join([chr(c ^ 0x55) for c in encoded])
if __name__ == '__main__':
print(f"Flag: {decode_flag()}")
输出结果为:
code复制Flag: flag{Welcome_to_HAIRUAN_CTF!}
提示:在实际比赛中,遇到类似简单加密时,可以先用CyberChef等工具尝试常见加密方式(XOR, ADD, SUB等基础运算),往往能快速发现规律。
对于想进一步提升逆向能力的选手,可以尝试以下变种练习:
这类基础题目虽然简单,但包含了逆向工程的核心思维模式:识别关键逻辑、理解数据处理流程、验证分析假设。掌握这些基础能力后,面对更复杂的题目时就能快速抓住重点。