您的位置:首页 > 移动开发

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

2015-05-19 20:26 323 查看
由于内容较长,所以打算分成几个部分来写。

实验准备知识:

实验三是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文件进行一下逆向反汇编。反汇编有两种,一种是利用objdump将bomb文件中的全部进行反汇编,利用的命令有:

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 源变址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: