【逆向工程实战】CSAPP Bomb Lab:从汇编指令到密码破解的完整拆弹指南

📅 2026/7/15 20:38:34
【逆向工程实战】CSAPP Bomb Lab:从汇编指令到密码破解的完整拆弹指南
1. 实验概览逆向工程实战演练Bomb Lab是CMU经典的反汇编与逆向工程实验通过拆除二进制炸弹的六个关卡你将系统掌握静态分析与动态调试的核心技能。这个实验的精妙之处在于它用游戏化的方式让你像安全研究员一样思考从晦涩的机器码中还原高级语言逻辑。实验文件解压后你会看到bomb64位Linux可执行程序你的拆弹目标bomb.c主程序框架代码不含关键逻辑README炸弹所属者信息关键工具链objdump -d bomb bomb.asm # 反汇编生成汇编代码 gdb bomb # 动态调试工具2. 环境配置与基础技巧2.1 Linux调试环境搭建推荐Ubuntu 20.04系统安装必备工具sudo apt install gdb binutils2.2 反汇编核心命令使用objdump获取炸弹的完整汇编代码objdump -d bomb | less # 分页查看汇编重点关注phase_x各关卡入口函数explode_bomb引爆炸弹的函数2.3 GDB调试三板斧设置断点(gdb) break phase_1 # 函数级断点 (gdb) break *0x400ee0 # 地址级断点查看寄存器/内存(gdb) info registers (gdb) x/s 0x402400 # 查看字符串 (gdb) x/8wx $rsp # 查看栈内容单步执行(gdb) stepi # 单步执行汇编指令 (gdb) nexti # 跳过函数调用3. Phase 1字符串比对实战3.1 静态分析查看phase_1的汇编代码phase_1: sub $0x8,%rsp mov $0x402400,%esi # 关键地址 callq 0x401338 strings_not_equal test %eax,%eax je 0x400ef7 phase_123 callq 0x40143a explode_bomb add $0x8,%rsp retq3.2 动态验证在GDB中查看0x402400处的字符串(gdb) x/s 0x402400 0x402400: Border relations with Canada have never been better.破解要点输入字符串必须与内存中的常量完全匹配使用strings_not_equal函数进行比对注意字符串结尾的换行符处理4. Phase 2数组与循环结构解析4.1 代码结构分析反汇编显示关键函数调用callq 0x40145c read_six_numbers # 读取6个数字 cmpl $0x1,(%rsp) # 第一个数字必须为14.2 循环模式识别核心循环逻辑mov -0x4(%rbx),%eax # 取前一个数 add %eax,%eax # 乘以2 cmp %eax,(%rbx) # 与当前数比较 je 0x400f25 # 相等则继续数学规律首项必须为1后续每个数字是前一个的2倍共需输入6个数字正确答案1 2 4 8 16 325. Phase 3Switch语句逆向5.1 输入格式解析通过sscanf的格式化字符串可知需要两个整数(gdb) x/s 0x4025cf %d %d5.2 跳转表分析关键跳转指令jmpq *0x402470(,%rax,8) # 基于第一个参数的跳转使用GDB查看跳转表(gdb) x/8xg 0x402470 0x402470: 0x0000000000400f7c 0x0000000000400fb9 0x402480: 0x0000000000400f83 0x0000000000400f8a ...5.3 合法输入组合第一个输入第二个输入020713112707......破解技巧第一个参数必须≤7第二个参数需匹配跳转后的赋值6. Phase 4递归函数破解6.1 函数原型还原func4的C语言等价实现int func4(int a, int b, int c) { int t ((c - b) (c - b) 31) 1; int q t b; if(q a) { if(q a) return 0; return 2 * func4(a, q1, c) 1; } return 2 * func4(a, b, q-1); }6.2 快速解法通过分析可知当第一个输入为7时递归直接返回0第二个输入必须为0正确答案7 07. Phase 5字符串编码转换7.1 字符处理逻辑核心算法movzbl (%rbx,%rax,1),%ecx # 取字符 and $0xf,%edx # 取低4位 movzbl 0x4024b0(%rdx),%edx # 查表转换7.2 字符映射表查看转换表内容(gdb) x/s 0x4024b0 maduiersnfotvbylSo you think...7.3 目标字符串需要匹配的字符串(gdb) x/s 0x40245e flyers破解步骤找出flyers各字符在映射表中的位置计算对应ASCII码的低4位反推出输入字符示例解IONEFG8. Phase 6链表结构逆向8.1 数据结构分析通过GDB查看节点(gdb) x/24wx 0x6032d0 0x6032d0 node1: 0x0000014c 0x00000001 0x006032e0 0x00000000 0x6032e0 node2: 0x000000a8 0x00000002 0x006032f0 0x00000000 ...8.2 排序要求程序会将输入数字用7减去按结果重新排列链表节点检查是否降序排列节点值表节点值node1332node2168node3924node4691node5477node6443正确答案4 3 2 1 6 59. 高阶技巧与调试心得组合断点(gdb) break explode_bomb # 捕获所有爆炸点自动化测试 创建ans.txt输入答案Border relations with Canada have never been better. 1 2 4 8 16 32 1 311 7 0 IONEFG 4 3 2 1 6 5运行测试./bomb ans.txt逆向思维训练遇到call指令时先记录函数参数关注test/jne等条件跳转的组合栈帧分析时注意%rsp的变化这个实验最精妙之处在于强迫你从CPU的角度思考问题。当我第一次通过汇编代码推导出链表结构时突然理解了指针和内存访问的本质。建议每个阶段完成后用C语言重写对应的逻辑这会极大加深对汇编的理解。