CSAPP bomblab

本文详细介绍了Bomblab的六个阶段的解决方案。从Phase_1到Phase_6,通过分析汇编代码、理解函数逻辑、解谜和调试,逐步揭秘每个阶段的过关秘诀。涉及字符串匹配、数字序列规律、链表排序等多个知识点。

Phase_1

使用命令disas phase_1获取bomb程序的phase_1的反编译出来的汇编代码,其中有下面这几行代码:

   0x08048b86 <+6>:	movl   $0x8049978,0x4(%esp)
   0x08048b8e <+14>:	mov    0x8(%ebp),%eax
   0x08048b91 <+17>:	mov    %eax,(%esp)
   0x08048b94 <+20>:	call   0x80490b3 <strings_not_equal>

根据函数的意思可以猜测出该函数的功能为输入两个字符串,如果不相等便会bomb掉,其中0x8049978应该是一个字符常量的地址,在gdb中输入p (char*)0x8049978将这个字符串打印出来为"When I get angry, Mr. Bigglesworth gets upset.",将这句话输入到bomb程序中,第一关通过。

Phase_2

根据call 0x8049020 <read_six_numbers>可以推断出第二关的答案为6个数字,假设从esp至ebp全部的变量都是int类型,用var[0]-var[9]表示过程栈中的10个变量

  0x08048bb4 <+16>:	mov    %eax,(%esp)
   0x08048bb7 <+19>:	call   0x8049020 <read_six_numbers>
   0x08048bbc <+24>:	mov    -0x1c(%ebp),%eax
   0x08048bbf <+27>:	cmp    $0x1,%eax
   0x08048bc2 <+30>:	je     0x8048bc9 <phase_2+37>
   0x08048bc4 <+32>:	call   0x804967a <explode_bomb>

可知,var[3]必须为1,否则就会bomb掉。
接下来运行

 0x08048bc9 <+37>:	movl   $0x1,-0x4(%ebp)
  0x08048bd0 <+44>:	jmp    0x8048bf4 <phase_2+80>
此时将var[9]置为1,然后跳到+80运行

+80的代码如下:

0x08048bf4 <+80>:	cmpl   $0x5,-0x4(%ebp)
0x08048bf8 <+84>:	jle    0x8048bd2 <phase_2+46>
0x08048bfa <+86>:	leave  

当var[9] <= 5时,程序会一直执行。
+46代码如下:

  0x08048bd2 <+46>:	mov    -0x4(%ebp),%eax
   0x08048bd5 <+49>:	mov    -0x1c(%ebp,%eax,4),%ecx
   0x08048bd9 <+53>:	mov    -0x4(%ebp),%eax
   0x08048bdc <+56>:	dec    %eax
   0x08048bdd <+57>:	mov    -0x1c(%ebp,%eax,4),%edx
   0x08048be1 <+61>:	mov    -0x4(%ebp),%eax
   0x08048be4 <+64>:	inc    %eax
   0x08048be5 <+65>:	imul   %edx,%eax
   0x08048be8 <+68>:	cmp    %eax,%ecx
   0x08048bea <+70>:	je     0x8048bf1 <phase_2+77>
   0x08048bec <+72>:	call   0x804967a <explode_bomb>
   0x08048bf1 <+77>:	incl   -0x4(%ebp)

这段汇编的伪代码为:
eax = var[9]
ecx = var[3+eax]
eax = var[9]
eax–
edx = var[3+eax]
eax = var[9]
eax++
eax = eax * edx
if eax != ecx bomb
var[9]++
goto +80
因此phase_2的结果规律为设res[1] = 1,有规则res[i+1] = res[i] * factor,其中factor = i + 1,所以最后的结果为1 2 6 24 120 720。

Phase_3

在phase_3中依然将栈中的变量设为var[0:n]

   0x08048c02 <+6>:	movl   $0x0,-0x8(%ebp)	
   0x08048c09 <+13>
### CSAPP Bomb Lab 实验指导 Bomb Lab 是《计算机系统:程序员视角》(CSAPP) 中的一个重要实验项目。该实验旨在帮助学生理解二进制文件的工作原理以及逆向工程的基础技能。 #### 实验目标 实验的主要目的是让学生通过分析给定的可执行程序 `bomb` 来找出六个阶段(phase) 的输入字符串,从而成功解除炸弹爆炸[^2]。如果输入错误,则会触发“BOOM!!!”,表示炸弹引爆;而正确输入则可以顺利进入下一阶段直至完成全部六阶段挑战。 #### 工具准备 为了顺利完成此实验,建议准备好以下工具: - **GDB调试器**:用于逐步跟踪代码执行过程并查看寄存器状态。 - **objdump反汇编工具**:能够将机器码转换成人类可读形式以便阅读和理解。 - **hex编辑器**:当遇到难以解释的数据时可能需要用到此类软件来观察原始字节流。 #### 解题思路概述 ##### 阶段一至六通用方法论 对于每一个阶段来说,基本策略如下: 1. 使用 GDB 设置断点于各个阶段入口处; 2. 运行程序直到到达指定位置后暂停下来; 3. 利用 objdump 或者其他手段获取当前函数对应的汇编指令集; 4. 结合已知条件推导出满足要求的具体数值或字符序列作为最终答案提交测试验证其有效性。 具体到不同阶段可能会涉及到更复杂的逻辑判断或是特定算法的应用,比如循环结构、位运算操作等都需要仔细研究才能得出结论[^1]。 ```bash gdb ./bomb (gdb) break *phase_1 (gdb) run ``` 上述命令展示了如何设置 GDB 断点以开始对第一个阶段的研究工作。 #### 参考资料推荐 - 官方教材《Computer Systems: A Programmer's Perspective (CSAPP)》,其中包含了大量有关底层编程的知识背景介绍。 - 各大高校公开课程网站上发布的相关教学材料往往也具有很高的参考价值,特别是那些附带详细解答说明的内容更是不可多得的学习资源。 - 社区论坛和技术博客也是不错的选择,在这里可以找到许多前辈分享的经验贴子和个人见解,有助于拓宽解决问题的角度与思维方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值