CSAPP课程实验 bomb实验 拆炸弹实验(1)

由于内容较长,所以打算分成几个部分来写。

实验准备知识:

实验三是CSAPP课程中的bomb炸弹实验。一个非常有意思的实验。实验主要提供了2个文件,一个bomb二进制可执行文件,一个bomb.c C源文件。实验主要设置6个关卡phase,要求你每一关输入一个特定的字符串,来拆掉炸弹。主要是考察对汇编语言的熟悉理解程度,反汇编和逆向工程以及gdb调试。感觉datalab主要是对应教材的第二章信息的表示预处理章节,而bomb实验主要是对应教材的第三章,程序的机器级表示章节,对寄存器,主存的理解,对汇编指令的理解,控制循环跳转switch语句的考察,以及过程,过程中的栈的调用过程以及递归过程等,对数组指针以及链表等数据结构的理解等的考察。

由于炸弹拆除过程比较繁琐,所涉及的知识点比较多,下面按照拆除过关的顺序来写。

首先,之前做过一次,我首先将之前的加压后的实验3文件夹删掉


首先将windows下的实验3.zip拖到linux下,之前先安装vmtools,可以实现windows和linux下文件的复制黏贴,这里压缩文件采用zip格式,是方便linux下对其进行解压。

解压:unzip 实验3.zip


解压后看到实验3中的内容是LAB3,然后在进入LAB3中看看lab3中具体有些什么内容。


进入lab3以后发现里面有如图所示的几个文件,然后用ll查看一下详细信息,权限之类的,发现bomb是一个不可执行的文件,然后在利用命令:chmod xxx filename 来修改一下文件的权限。在此处我用的是chmod 777 bomb 。777是将文件的权限全部修改为可读可写可执行。修改完以后在进行一下ll查看一下,rwx,bomb已经可以执行了。

拆炸弹的第一步就是要将bomb文件进行一下逆向反汇编。反汇编有两种,一种是利用objdumpbomb文件中的全部进行反汇编,利用的命令有:

objdump -d  bomb>1.txt

objdump  –d  bomb>bomb.s

上面两个命令都是将bomb全部反汇编,只是反汇编之后生成的文件的格式不同,一个是1.txt一个是bomb.s汇编代码格式。通过查看这两个生成的文件可以发现,两者的内容是一样的。

将生成的1.txt或者bomb.s复制到windows下面用notepad++打开,选择语言为汇编语言,则带有颜色区别,也可以进行搜索查询,比较方便

反汇编另外一种则是在gdb下,利用disassemble命令,可简写为disass

 disass func(函数名) 将该函数对应的汇编代码反汇编出来

 disass  起始地址  结束地址  指定反汇编的代码的地址段

一般配合info line func(函数名)查看函数的起始地址一起来使用。

首先进入gdb调试下


比如在gdb下反汇编关卡1phase_1函数


当然在linux下面也可以用gedit打开,也可以搜索也可以。


然后接下来就是主要查看汇编代码,找到炸弹爆破的突破口将炸弹拆除了。

首先是要对gdb调试命令有一定的了解:

run  简写r  代表运行

kill 简写k  代表结束

c    代表继续运行

q    退出gdb调试模式

si   进行单步调试

s    不单步把这个函数执行完

设置断点:b  *addr  在某一个地址处设置断点

                   b   func(函数名)在某个函数的开始设置断点

还有在一个函数的某个地址处设置断点等。

删除断点:delete  删除全部已经设置的断点

                   delete  1  删除1这个断点

                   delete  1-3  删除1-3这几个断点

输出查看内容:gdb调试下,examine命令用于显示内存内容,常用的命令为:

                           x/<n/f/u>  n代表从起始地址开始显示几个地址

                                            f代表显示的格式,比如s为以字符串的格式,x代表以十六进制显示

                                           u代表显示几个字节,一般缺省代表4字节

                          举例:x/3xw从起始地址处每次显示3个地址,每个以16进制显示,每个4字节

                         gdb下面的p代表的是print

                         p/x 以十六进制显示

                         p/d 以十进制显示

                         p/t 以二进制显示

                         p/s 以字符串格式显示

                         p   $eax  查看寄存器eax中的内容

                         p/x  (char *)

                         p/x  *(int *)

还需要一些看懂和理解汇编基本指令。比如:

Je  相等时跳转

Jg  大于时跳转

Jl   小于时跳转

Ja   无符号数大于时跳转

eax 常用于保存返回值

ecx 常用于计数

edi 目的变址

ebx 基址

esi  源变址


猜你喜欢

转载自blog.csdn.net/shiyuqing1207/article/details/45849413