当前位置:文档之家› Bomb Lab实验报告

Bomb Lab实验报告

课程实验报告课程名称:计算机系统原理实验实验名称:Bomb Lab专业班级:姓名:学号:完成时间:2017.4.19一、实验目的熟悉汇编程序,学习gdb调试工具,熟悉并掌握函数调用过程中的栈帧结构的变化。

二、实验环境个人PC,Linux发行版本,终端,gdb调试工具。

三、实验要求1.本次实验为熟悉汇编程序及其调试方法的实验。

2.实验内容包含2个文件bomb(可执行文件)和bomb.c(c源文件)。

3.使用gdb工具反汇编出汇编代码,结合c语言文件找到每个关卡的入口函数。

4.分析汇编代码,找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符通关。

5.本实验一共有7个关卡,包括6个普通关卡和1个隐藏关卡。

要求至少通过6个普通关卡。

四、实验内容及操作步骤(一)准备过程1.解压文件夹得到“bomb”,“bomb.c”,“README-bomblab.txt”以及“实验基本内容与要求.txt”等文档。

查看“实验基本内容与要求.txt”了解实验内容与要求后打开bomb.c文件,编译发现不能通过,代码不完整,所以bomb.c 文件只能用来作为参考。

查看bomb.c文件发现控制密码正确的6个函数分别为phase_1,phase_2,phase_3,phase_4,phase_5,phase_6,因此可以对bomb文件反汇编得到汇编文本,结合汇编文本与bomb.c文本进一步分析。

2.进入Ubuntu,将bom和bomb.c文档复制到主文件目录下,ctrl+alt+t打开终端,通过“objdump -d bomb > bomb.s”命令将可执行文件反汇编成bomb.s文件,并且可以通过“gdb -q bomb”进行调试。

3.将bomb.c复制成文本后打开bomb.c查看汇编代码并进一步分析。

(二)关卡分析1.phase_1phase_1汇编代码及注释如下:08048f61 <phase_1>:8048f61: 55 push %ebp8048f62: 89 e5 mov %esp,%ebp8048f64: 83 ec 18 sub $0x18,%esp #开辟一个24位的栈空间8048f67: c7 44 24 04 5c a1 04 movl $0x804a15c,0x4(%esp) #将0x804a15c存到%eap+4的位置,x/s 0x804a15c 得到 "We have to stand with our North Korean allies."8048f6e: 088048f6f: 8b 45 08 mov 0x8(%ebp),%eax8048f72: 89 04 24 mov %eax,(%esp) #将%ebp+8处的值存到%esp8048f75: e8 31 00 00 00 call 8048fab<strings_not_equal>8048f7a: 85 c0 test %eax,%eax8048f7c: 74 05 je 8048f83 <phase_1+0x22> #%eax=0则跳出函数,否则跳到爆炸函数,可以看出,调用<strings_not_equal>函数后如果两个字符串相等的话最后%eax会等于0 8048f7e: e8 4e 01 00 00 call 80490d1 <explode_bomb> 8048f83: c9 leave8048f84: c3 ret8048f85: 90 nop8048f86: 90 nop8048f87: 90 nop8048f88: 90 nop8048f89: 90 nop8048f8a: 90 nop8048f8b: 90 nop8048f8c: 90 nop8048f8d: 90 nop8048f8e: 90 nop8048f8f: 90 nop思路与分析:通过call 8048fab <strings_not_equal> 我们可以推断要求输入的是一串字符串,movl $0x804a15c,0x4(%esp)将地址0x804a15c存到%esp+4的位置,mov 0x8(%ebp),%eax 和mov %eax,(%esp)将输入的字符串存到%esp中,call 8048fab <strings_not_equal> 调用字符串比较函数,通过比较上面位置参数%esp+4与%esp对应的字符串是否相等,将返回值存到%eax中,test %eax,%eax,je 8048f83 <phase_1+0x22>,call 80490d1<explode_bomb>,判断如果两个字符串不相等则爆炸。

由上面分析可知地址0x804a15c中存着正确的字符串,我们只要输入相同的字符串就可以通过关卡。

进入gdb,通过命令x/s 0x804a15c查看该字符串为:"We have to stand with our North Korean allies."所以phase_1的通关密码为:"We have to stand with our North Korean allies."通过 r 命令运行程序,输入该字符串则通过第一关:结论与心得:通过分析汇编代码,通过字符串比较函数<strings_not_equal> 可以推测输入的是一串字符串,通过x/s以字符串的形式查看地址0x804a15c所对应的值,运行程序后输入该字符串即可通过关卡。

字符串比较函数主要是通过将两个字符串进行比较,将结果存到%eax中,最后判断%eax的值。

第一关相对比较简单,也比较好理解。

2.phase_2phase_2汇编代码及注释如下:08048d6a <phase_2>:8048d6a: 55 push %ebp8048d6b: 89 e5 mov %esp,%ebp8048d6d: 56 push %esi8048d6e: 53 push %ebx8048d6f: 83 ec 30 sub $0x30,%esp8048d72: 8d 45 e0 lea -0x20(%ebp),%eax8048d75: 89 44 24 04 mov %eax,0x4(%esp) #将第一个数字的地址放到%esp+4的位置8048d79: 8b 45 08 mov 0x8(%ebp),%eax8048d7c: 89 04 24 mov %eax,(%esp)8048d7f: e8 87 03 00 00 call 804910b<read_six_numbers> #读取六个数字8048d84: 83 7d e0 00 cmpl $0x0,-0x20(%ebp)8048d88: 75 06 jne 8048d90 <phase_2+0x26> #0和-0x20(%ebp)比较,不相等就爆炸8048d8a: 83 7d e4 01 cmpl $0x1,-0x1c(%ebp)8048d8e: 74 05 je 8048d95 <phase_2+0x2b> #1和-0x1c(%ebp)比较,相等就跳过爆炸8048d90: e8 3c 03 00 00 call 80490d1 <explode_bomb>8048d95: 8d 5d e8 lea -0x18(%ebp),%ebx #将第三个数字的地址传到%ebx中,即现在%ebx中存着第三个数字的地址 8048d98: 8d 75 f8 lea -0x8(%ebp),%esi #将%ebx的地址传到%esi,%esi用于待会的判断结束条件,%ebx存的地址一直循环加4,循环直到%ebx的下一个地址是%esi就结束】8048d9b: 8b 43 fc mov -0x4(%ebx),%eax #将第二个数放到%eax寄存器中8048d9e: 03 43 f8 add -0x8(%ebx),%eax #计算第二个数和第一个数的和8048da1: 39 03 cmp %eax,(%ebx)8048da3: 74 05 je 8048daa <phase_2+0x40> #前两个数的和与第三个数相比较,相等则跳过炸弹8048da5: e8 27 03 00 00 call 80490d1 <explode_bomb> 8048daa: 83 c3 04 add $0x4,%ebx #将%ebx的地址加4,现在%ebx中存着第四个数字的地址8048dad: 39 f3 cmp %esi,%ebx8048daf: 75 ea jne 8048d9b <phase_2+0x31> #比较现在%esi和%ebx里面的值是否相等,不相等则循环,否则结束。

其实两个寄存器中存的都是地址,为的是保证只输入6个数,因为当输入第7个数时,%ebx=%esi8048db1: 83 c4 30 add $0x30,%esp8048db4: 5b pop %ebx8048db5: 5e pop %esi8048db6: 5d pop %ebp #释放栈帧8048db7: c3 ret思路与分析:通过call 804910b <read_six_numbers>我们可以推断出应该是要输入6个数字。

通过对汇编代码进行分析知道-0x20(%ebp)存着第一个数字,-0x1c(%ebp)存着第二个数字,依次类推。

通过cmpl $0x0,-0x20(%ebp),jne 8048d90<phase_2+0x26>和cmpl $0x1,-0x1c(%ebp),je 8048d95 <phase_2+0x2b>知道第一个数字必须是0,第二个数字必须是1,否则就爆炸。

命令lea-0x18(%ebp),%ebx初始化寄存器%ebx的值,将第三个数字的地址传到%ebx中.lea -0x8(%ebp),%esi将%ebx的地址传到%esi,%esi用于待会的判断结束条件,%ebx存的地址一直循环加4,循环直到%ebx的下一个地址是%esi就结束,mov -0x4(%ebx),%eax将第二个数放到%eax寄存器中,add-0x8(%ebx),%eax计算第二个数和第一个数的和,cmp %eax,(%ebx),je 8048daa <phase_2+0x40>前两个数的和与第三个数相比较,相等则跳过炸弹。

相关主题