
1. 项目背景与赛事解析华南赛区软件系统安全赛作为国内信息安全领域的重要赛事今年已是第二十一届。这个比赛主要考察参赛者在逆向工程、漏洞挖掘、密码破解等方面的实战能力。其中re2题目作为初赛环节的典型题型往往涉及二进制程序逆向分析的核心技能点。我去年带队参加过这个赛事发现初赛题目设计有几个显著特点一是侧重基础能力考察不刻意设置复杂混淆二是题目场景贴近实际常模拟真实软件中的安全机制三是评分标准严格要求选手在有限时间内完成从静态分析到动态调试的全流程。这类比赛对培养安全工程师的实战能力非常有价值。2. re2题目技术解析2.1 题目特征分析从往届赛题来看re2这类题目通常会给参赛者提供一个Linux平台的ELF可执行文件。程序可能包含以下典型特征使用UPX等工具进行基础加壳包含简单的反调试检测机制采用标准输入输出进行交互验证逻辑包含多层条件判断去年的一道类似题目就采用了分段验证的方式要求输入通过3个校验函数才能获取flag。这种设计既考察基础逆向能力又测试选手的系统性思维。2.2 解题工具链准备针对这类题目建议准备以下工具链静态分析工具IDA Pro 7.7基础反汇编Ghidra 10.1交叉参考分析Binary Ninja快速原型分析动态调试工具GDB with pwndbg插件radare2轻量级调试strace/ltrace系统调用追踪辅助工具strings字符串提取xxd十六进制查看patchelf二进制修改特别注意建议在Ubuntu 20.04 LTS环境下搭建工具链这个版本对各种安全工具的兼容性最好。避免使用最新发行版某些工具可能尚未适配。3. 详细解题步骤3.1 初步文件分析首先对题目文件进行基础检查file re2 # 输出ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked... checksec --filere2 # 输出RELRO STACK CANARY NX PIE # Partial RELRO No canary found NX enabled No PIE这些信息告诉我们是64位Linux可执行文件没有开启栈保护Canary启用了NX防护不可执行栈没有地址随机化PIE3.2 静态逆向分析使用IDA Pro加载程序观察主要函数逻辑。通常这类题目的主函数结构如下int __cdecl main(int argc, const char **argv, const char **envp) { char input[32]; // [rsp0h] [rbp-20h] BYREF setvbuf(stdout, 0LL, 2, 0LL); printf(Input your flag: ); fgets(input, 32, stdin); if ( check1(input) check2(input) check3(input) ) puts(Congratulations!); else puts(Try again.); return 0; }关键点在于分析三个check函数的验证逻辑。以check1为例常见的验证模式包括固定字符串比对strcmp异或加密后的比对数学运算验证查表验证3.3 动态调试技巧当静态分析遇到困难时需要结合动态调试。使用pwndbg的一些实用命令# 设置断点在第一个check函数 b *0x400123 # 运行程序 r # 查看寄存器状态 context reg # 查看栈帧 stack 20 # 单步执行 si特别注意函数调用时的参数传递和返回值存储位置。x86_64架构下前六个参数通过rdi、rsi、rdx、rcx、r8、r9传递。4. 常见问题与解决方案4.1 反调试对抗题目可能包含基础的反调试措施if (ptrace(PTRACE_TRACEME, 0, 0, 0) 0) { exit(1); }绕过方法使用IDA的调试器自带绕过功能二进制patch掉ptrace调用通过LD_PRELOAD hook ptrace函数4.2 加密算法识别当遇到数据变换时注意识别常见加密特征多次异或可能看到xor指令循环Base64包含特征字符表和填充等号TEA加密有delta常量0x9E3779B9RC4256字节的初始化过程4.3 时间约束问题比赛环境可能限制调试时间建议先做完整的静态分析提前准备好常用gdb脚本对关键函数制作签名快速定位5. 实战经验分享在去年比赛中我们遇到一道re题目使用了多层嵌套的switch结构。通过以下方法成功破解使用Ghidra的Decompiler查看伪代码发现每个case对应一个字符验证编写angr脚本自动化求解import angr proj angr.Project(./re2) state proj.factory.entry_state() simgr proj.factory.simulation_manager(state) simgr.explore(find0x400123, avoid0x400456) print(simgr.found[0].posix.dumps(0))另一个实用技巧是使用radare2的可视化模式r2 -AAA ./re2 # 进入可视化模式 V # 按p切换视图模式这些经验在实战中能显著提高解题效率。建议平时多积累各种工具的使用技巧比赛时才能快速应对不同题型。