一、实验目的
1.理解C语言程序的机器级表示。
2.初步掌握GDB调试器的用法。
3.阅读C编译器生成的x86-64机器代码,理解不同控制结构生成的基本指令模式,过程的实现。
二、 实验环境
- SecureCRT(10.105.222.110)
- Linux
- Objdump命令反汇编
- GDB调试工具
三、实验内容
登录bupt1服务器,在home目录下可以找到Evil博士专门为你量身定制的一个bomb,当运行时,它会要求你输入一个字符串,如果正确,则进入下一关,继续要求你输入下一个字符串;否则,炸弹就会爆炸,输出一行提示信息并向计分服务器提交扣分信息。因此,本实验要求你必须通过反汇编和逆向工程对bomb执行文件进行分析,找到正确的字符串来解除这个的炸弹。
本实验通过要求使用课程所学知识拆除一个“binary bombs”来增强对程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。 “binary bombs”是一个Linux可执行程序,包含了5个阶段(或关卡)。炸弹运行的每个阶段要求你输入一个特定字符串,你的输入符合程序预期的输入,该阶段的炸弹就被拆除引信;否则炸弹“爆炸”,打印输出 “BOOM!!!”。炸弹的每个阶段考察了机器级程序语言的一个不同方面,难度逐级递增。
为完成二进制炸弹拆除任务,需要使用gdb调试器和objdump来反汇编bomb文件,可以单步跟踪调试每一阶段的机器代码,也可以阅读反汇编代码,从中理解每一汇编语言代码的行为或作用,进而设法推断拆除炸弹所需的目标字符串。实验2的具体内容见实验2说明。
四、实验步骤及实验分析
建议按照:准备工作、阶段1、阶段2、等来组织内容
各阶段需要有操作步骤、运行截图、分析过程的内容
准备工作
(1) 登录bupt1服务器。
(2) 进行操作解压.tar文件:Ls查看目录,看到bomb277.tar -> ‘rm -r bomb277’-> tar xvf bomb277.tar
(3) 查看bomb.c,控制检测的函数有7个
(4) 输入vi bomb.c 查看bomb.c的c语言代码:wq!退出,,控制检测的函数有7个
(5) objdump -d bomb >bomb.txt
(6) gdb disas +name 用gdb工具可得到反汇编代码
(7)设置各函数间的断点
(8) 为了避免爆炸过多扣分严重,可将爆炸函数处设置断点
阶段一
1.观察bomb.c源码
可以看出:
(1) 首先调用了read_line()函数,用于输入炸弹秘钥,输入放置在char* input中。
(2) 调用phase_1函数,输入参数即为input,可以初步判断,phase_1函数将输入的input字符串与程序内部的炸弹秘钥进行比较。
2.启用gdb进行调试
3.在gdb工具下输入disas phase_1观察
(1)、<phase_1+0>:sub $0x8, %rsp,将函数栈空间扩展了0x8字节
(2)、<phase_1+4>:将0x402680 放置到了esi的地方。。
(3)、<phase_1+9>:调用strings_not_equal函数。