拆弹实验
拆弹实验
二进制拆弹实验通常是一些高校计算机系统基础的实验,通常考察一些汇编的知识和对程序的理解。在这里以一个6关卡的拆弹实验作为例子,讲解拆弹实验的完成思路。
准备工作
linux环境的构建工作,由于我不想写篇幅的限制,在这里就省略了。
准备工作可以大致分为以下几个步骤。
- 将炸弹数据包bomblab.tar解压,并进入终端中的炸弹压缩包所在目录
- 解压压缩包
1
tar -xvf bomblab.tar
- 运行炸弹。在解压出来的炸弹文件夹下,运行
1
./bomb
- 如果出现权限限制,给bomb增加可执行权限即可
1
chmod +x bomb
- 利用objdump工具进行反汇编,并将输出的汇编指令导入文件当中
1
objdump -d bomb > bomb.s
- 接下来打开一个炸弹所在目录下的终端,和
bomb.s
文件,开始拆弹吧!
工具介绍
GNU symbolic debugger
,简称GDB ,是 Linux 中最常用的一款程序调试器。GDB 通常以 gdb 命令的形式在终端(Shell)中使用。
GDB中有很多种的调试命令。现列举在后面过程中经常用到的几种。
- 打开GDB: gdb [调试程序名称]
1
gdb bomb
- 查看寄存器的内容: i r [寄存器名称]
1
2i r eax
#info register eax - 查看断点: i b
1
2i b
#info breakpoints - 设置断点: b *[地址]
1
b *0x8040abc
- 打印字符串: x /s [地址]
1
x /s 0x8041234
phase0 字符串匹配
题目介绍
该阶段要求输入与程序中内置的某一特定字符串相匹配的字节序列。代码分析
找到bomb.s中的phase0部分,可能与我下文的内容不一样,只要找到phase0即可。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
240804898b <phase_0>:
#基址指针入栈,因为要另起一个栈了
804898b: 55 push %ebp
#栈顶指针位置变成栈基
804898c: 89 e5 mov %esp,%ebp
#栈操作
804898e: 83 ec 08 sub $0x8,%esp
8048991: 83 ec 08 sub $0x8,%esp
#把正确答案入栈
8048994: 68 ec 96 04 08 push $0x80496ec
8048999: ff 75 08 pushl 0x8(%ebp)
#比较输入和正确答案是否一样
804899c: e8 1a 08 00 00 call 80491bb <strings_not_equal>
80489a1: 83 c4 10 add $0x10,%esp
80489a4: 85 c0 test %eax,%eax
#相等跳转
80489a6: 74 0c je 80489b4 <phase_0+0x29>
#炸弹爆炸
80489a8: e8 76 0a 00 00 call 8049423 <explode_bomb>
80489ad: b8 00 00 00 00 mov $0x0,%eax
80489b2: eb 05 jmp 80489b9 <phase_0+0x2e>
80489b4: b8 01 00 00 00 mov $0x1,%eax
80489b9: c9 leave
80489ba: c3 ret
- 上述的汇编代码是AT&T格式的汇编代码,因此,%表示的意思是(寄存器的)内容。
- ebp寄存器,其中bp表示base pointer,是基址指针。而e是扩展的意思,随着机器位数增加,出现的扩展。
- push是入栈,把某个内容推入栈中。
- mov是移动指令,就是把第一个值赋给第二个,如上第二条指令就是将当前栈顶指针的值赋值给基址指针,可以认为是另起一个栈。
- push $0x80496ec 可以判断,字符串就是在这时导入进来的。
- call调用了一个函数,根据英文名称,可以看出这个函数的意思是字符串不相等。
- je是指jump equal,相等跳转。根据上下文意思可以知道,如果相等,那么就跳转到后面,否则就继续执行到爆炸函数。
- ret即为return返回。
- 剩余的内容对于解题来说并非十分重要,因此不予详解。
解决方案
1 | $ gdb bomb |
phase1 浮点表示
题目介绍
该阶段要求输入对应某浮点(float或double)数值表示的一对整数(short或int)。
代码分析
找到bomb.s中的phase1部分,可能与我下文的内容不一样,只要找到phase1即可。
1 | 080489bb <phase_1>: |
- 两个炸弹爆炸,条件分别是eax寄存器不等于2,和eax寄存器和edx寄存器内容不相等。
- 由于题目中提到是一对整数,因此猜测第一次比较2,是比对答案的数目。(后将验证)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 静心斋!
评论