Bomblab实验报告.docx
- 文档编号:7403812
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:31
- 大小:1.59MB
Bomblab实验报告.docx
《Bomblab实验报告.docx》由会员分享,可在线阅读,更多相关《Bomblab实验报告.docx(31页珍藏版)》请在冰豆网上搜索。
Bomblab实验报告
课程实验报告
课程名称:
计算机系统原理实验
实验项目名称:
BombLab
专业班级:
计科1501
姓名:
马子垚
学号:
201508010114
完成时间:
2017年4月19日
实验目的
理解汇编语言,学会使用调试器
实验原理
二进制炸弹是作为一个目标代码文件提供给学生们的程序,运行时,它提示用户输入6个不同的字符串。
如果其中任何一个不正确,炸弹就会“爆炸”:
打印出一条错误信息。
学生通过反汇编和逆向工程来确定是哪六个字符串,从而解除他们各自炸弹的雷管。
实验步骤及体会
一、实验准备
1、首先,由于虚拟机操作系统与windows系统相互独立,所以首先将Bomb.c及其相关文件存至XX云盘,然后在ubantu操作系统内下载至文件系统目录下的下载文件夹里面:
2、输入./bomb试运行bomb.c文件时会提示权限不够:
所以需要输入chmod+x+文件名的命令于改变文件或目录的访问权限。
用它控制文件或目录的访问权限。
在经过操作之后,获得了权限,程序可以正常运行了:
3、由于bomb.c文件并没有蕴含许多能破解的信息,所以需要将其进行反汇编,详细操作如下:
输入objdump–dbomb>bomb.txt将汇编代码输出到自动生成一个bomb.txt的文件里面,方便我们查看与分析代码:
二、具体实验步骤及其分析
试查看导出的bomb.txt,我发现总的文本里面分为很多段,其中就有Phase_1~Phase_6、Phase_defuse、Phase_secret以及其他相关函数的代码,所以我猜测每一段Phase代码就是我们需要破解的关卡,所以我将它们分别导出新建text文件,逐段分析。
Phase_1及其破解过程:
知识点:
string,函数调用,栈
反汇编代码及其分析:
08048f61
8048f61:
55push%ebp
//压栈ebp为栈指针esp为栈指针。
push指令可以理解为两个步骤:
1.subl$4,%esp–栈底向下移一位
2.movl%ebp,(%esp)将ebp的值存入esp中
8048f62:
89e5mov%esp,%ebp
//把esp赋值给ebp
8048f64:
83ec18sub$0x18,%esp
//esp指针下移0x18个字节
8048f67:
c74424045ca104movl$0x804a15c,0x4(%esp)
//取0x804a15c处的内容存入*(%esp+4)
//前一段总的分析:
初始化栈,push是压栈指令,ebp寄存器中的内容是栈底指针。
esp寄存器里面存的是栈顶地址。
通过sub指令,将栈顶固定在第十八个存储单元里面。
字符串的内存地址为0804a15c,四个字节。
一个存储单元存放8个bit两个十六进制数字,栈顶及后三个单元存栈顶地址。
故用mov指令将字符串地址存在栈顶后的第四个字节处。
8048f6e:
08
8048f6f:
8b4508mov0x8(%ebp),%eax
//取用户输入的内容存入%ebp
8048f72:
890424mov%eax,(%esp)
//eax的值赋值给*esp
8048f75:
e831000000call8048fab
//调用字符串比较函数,string_not_equal就提示需要比较两个字符串,通过gcc函数调用规范知道压入堆栈的两个参数分别为输入字符串与程序内部字符串。
8048f7a:
85c0test%eax,%eax
//test执行的就是and的指令,不会保存and执行的结果,而是根据and的结果设置flags寄存器的各种标志。
8048f7c:
7405je8048f83
//Je指令:
当ZF等于零的时候跳转,也就是相等的时候跳转。
判断%eax是否为0,为0跳转,不为0引爆
8048f7e:
e84e010000call80490d1
8048f83:
c9leave
//为结束函数做准备
8048f84:
c3ret
//返回。
ret:
不带任何参数时,用于在子程序的结束位置,被调用的子程序必须有ret指令,否则调用没有ret指令的子程序会导致自陷,子程序执行完之后处于失控状态。
带参数retn表示子程序返回主程序的同时,堆栈弹出n个字节(栈顶指针减n)
具体操作:
读取0x804a15c内存的字符串(密码),并设置断点。
成功读取到字符串,作为密码输入:
第一关成功破解
程序流程:
1、取内存地址0x8049a04处的内容;
2、取用户输入的内容(即密码);
3、比较两者的值,相等则%eax置为0,进入下一关,不相等则调用引爆程序引爆炸弹。
Phase_2及其破解过程:
知识点:
循环语句,数组
08048d6a
8048d6a:
55push%ebp
8048d6b:
89e5mov%esp,%ebp
8048d6d:
56push%esi
8048d6e:
53push%ebx
8048d6f:
83ec30sub$0x30,%esp
8048d72:
8d45e0lea-0x20(%ebp),%eax
//lea:
取偏移地址将一个数的内存单元的偏移地址,送入寄存器中存储,与mov不同的是mov是将该数当作一个偏移地址存入寄存器,没有寻址的功能。
8048d75:
89442404mov%eax,0x4(%esp)
//取用户输入的内容,存入%ebp
8048d79:
8b4508mov0x8(%ebp),%eax
8048d7c:
890424mov%eax,(%esp)
//前面几行均为初始化栈操作
8048d7f:
e887030000call804910b
//调用函数read_six_numbers(说明密码是6个数字)
8048d84:
837de000cmpl$0x0,-0x20(%ebp)
//比较第一个输入的的数是否为0
8048d88:
7506jne8048d90
//若不为0(jne看出)则跳转下一步(爆炸)
//比较第二个输入的的数是否为1
8048d8a:
837de401cmpl$0x1,-0x1c(%ebp)
//若为1(je)则跳转下一步(8048d95)
8048d8e:
7405je8048d95
8048d90:
e83c030000call80490d1
8048d95:
8d5de8lea-0x18(%ebp),%ebx
8048d98:
8d75f8lea-0x8(%ebp),%esi
8048d9b:
8b43fcmov-0x4(%ebx),%eax
//下一个数必须是前两个数之和
8048d9e:
0343f8add-0x8(%ebx),%eax
8048da1:
3903cmp%eax,(%ebx)
//若为前两个数之和则跳转下一步(8048daa),否则爆炸
8048da3:
7405je8048daa
8048da5:
e827030000call80490d1
8048daa:
83c304add$0x4,%ebx
8048dad:
39f3cmp%esi,%ebx
//回到8048d9b,相当于一个循环,esi和edx都是地址寄存器,首先将两个地址比较,当他们相同的时候,就一直向下,否则跳转。
8048daf:
75eajne8048d9b
8048db1:
83c430add$0x30,%esp
8048db4:
5bpop%ebx
8048db5:
5epop%esi
8048db6:
5dpop%ebp
8048db7:
c3ret
总体上看,这一关让我们输入的是以0为首项的Fibonacc数列。
密码:
011235
故在第一个的基础上:
程序流程:
1.读取用户输入内容(为6个数字);
2.判断输入的第一个值是否为0,不是则引爆炸弹;
3.判断输入的第一个值是否为1,不是则引爆炸弹;
3.做一个6次循环,判断后一个数是否等于前两个数之和,不是则引爆炸弹;
4.六个数字判断相等结束后,进入下一关
Phase_3及其破解过程:
知识点:
switch语句
08048ea1
8048ea1:
55push%ebp
8048ea2:
89e5mov%esp,%ebp
8048ea4:
83ec28sub$0x28,%esp
//初始化栈的操作
8048ea7:
8d45f0lea-0x10(%ebp),%eax
//用户输入的参数2存在*(%ebp-10)
8048eaa:
8944240cmov%eax,0xc(%esp)
//用户输入的参数1存在*(%ebp-c)
8048eae:
8d45f4lea-0xc(%ebp),%eax
8048eb1:
89442408mov%eax,0x8(%esp)
//取出地址0x804a23e中的内容
8048eb5:
c74424043ea204movl$0x804a23e,0x4(%esp)
8048ebc:
08
8048ebd:
8b4508mov0x8(%ebp),%eax
8048ec0:
890424mov%eax,(%esp)
8048ec3:
e878f9ffffcall8048840<__isoc99_sscanf@plt>
//调用sscanf函数,传入输入参数,scanf函数调用之后可能导致eax里面的保存的数据发生改变。
8048ec8:
83f801cmp$0x1,%eax
//scanf读入数据流之后,%eax寄存的是读入数据的个数。
8048ecb:
7f05jg8048ed2
8048ecd:
e8ff010000call80490d1
8048ed2:
837df407cmpl$0x7,-0xc(%ebp)
//必须-0xc(%ebp)的值小于7,否则爆炸
8048ed6:
776bja8048f43
8048ed8:
8b45f4mov-0xc(%ebp),%eax
//相当于switch(a)
8048edb:
ff2485a0a10408jmp*0x804a1a0(,%eax,4)
//跳转到以地址*0x804a1a0为基址的跳转表中
8048ee2:
b800000000mov$0x0,%eax
8048ee7:
eb53jmp8048f3c
8048ee9:
b800000000mov$0x0,%eax
8048eee:
6690xchg%ax,%ax
8048ef0:
eb45jmp8048f37
8048ef2:
b800000000mov$0x0,%eax
8048ef7:
eb39jmp8048f32
8048ef9:
b800000000mov$0x0,%eax
8048efe:
6690xchg%ax,%ax
8048f00:
eb2bjmp8048f2d
8048f02:
b800000000mov$0x0,%eax
8048f07:
eb1fjmp8048f28
8048f09:
b800000000mov$0x0,%eax
8048f0e:
6690xchg%ax,%ax
8048f10:
eb11jmp8048f23
8048f12:
b814030000mov$0x314,%eax
8048f17:
eb05jmp8048f1e
8048f19:
b800000000mov$0x0,%eax
8048f1e:
2d5a030000sub$0x35a,%eax
8048f23:
05ef020000add$0x2ef,%eax
8048f28:
2d16020000sub$0x216,%eax
8048f2d:
0516020000add$0x216,%eax
8048f32:
2d16020000sub$0x216,%eax
8048f37:
0516020000add$0x216,%eax
8048f3c:
2d16020000sub$0x216,%eax
8048f41:
eb0ajmp8048f4d
8048f43:
e889010000call80490d1
8048f48:
b800000000mov$0x0,%eax
//输入的第一个数字必须小于5,否则爆炸
8048f4d:
837df405cmpl$0x5,-0xc(%ebp)
8048f51:
7f05jg8048f58
//表示输入的第二个数字必须等于第一个数经过数次运算的结果
8048f53:
3b45f0cmp-0x10(%ebp),%eax
//成功跳出
8048f56:
7405je8048f5d
8048f58:
e874010000call80490d1
8048f5d:
c9leave
8048f5e:
6690xchg%ax,%ax
8048f60:
c3ret
帧堆栈数据记录表:
具体分析:
由movl$0x804a23e,0x4(%esp),用gdb查看0x804a23e的值
发现这个应该是要求输入两个数字
jmp*0x804a1a0(,%eax,4)
首先,看到这个语句不知道是什么意思,搜索也搜索不到这段地址。
后来通过XX,发现这是一个基于跳转表的switch语句的汇编描述,后来决定自己编写一个switch语句去运行,理解了switch语句在汇编中的表达方式。
1当第一个数输入0时去查看*0x804a1a0+4*0=*0x804a1a0的值
所以会跳转到0x8048f12那行代码中
则后面的运算为0x(314-35a+2ef-216).转换为十进制为147。
故输入0147
得到结果(接第二个炸弹)
同理:
2输入1
运算得到1-641
3输入2
运算得到2217(运行结果略)
4输入3
运算得到3534(运行结果略)
5输入4
运算得到40(运行结果略)
程序流程:
1.读取输入参数1和参数2,调用ssanf函数传入两个参数;
2.比较参数1与7的大小,小于等于7继续,大于7引爆;
3.根据参数1的值来搜索跳转地址,计算得到最终的%eax;
4.比较参数1与5的大小,小于等于5继续,大于5引爆;
5.比较参数2与计算得到的%eax是否相等,相等则进入下一关,不相等则引爆。
Phase_4及其破解过程:
知识点:
递归
08048e2e
8048e2e:
55push%ebp
8048e2f:
89e5mov%esp,%ebp
8048e31:
83ec28sub$0x28,%esp
8048e34:
8d45f0lea-0x10(%ebp),%eax
8048e37:
8944240cmov%eax,0xc(%esp)
8048e3b:
8d45f4lea-0xc(%ebp),%eax
8048e3e:
89442408mov%eax,0x8(%esp)
8048e42:
c74424043ea204movl$0x804a23e,0x4(%esp)
8048e49:
08
8048e4a:
8b4508mov0x8(%ebp),%eax
8048e4d:
890424mov%eax,(%esp)
//调用sscanf函数,传入输入参数
8048e50:
e8ebf9ffffcall8048840<__isoc99_sscanf@plt>
8048e55:
83f802cmp$0x2,%eax
//输入的为两个数据,否则引爆
8048e58:
750cjne8048e66
8048e5a:
8b45f4mov-0xc(%ebp),%eax
8048e5d:
85c0test%eax,%eax
//第一个数字为负数则跳转至爆炸
8048e5f:
7805js8048e66
8048e61:
83f80ecmp$0xe,%eax
//第一个数字必须小于14则跳转,否则继续运行至爆炸
8048e64:
7e05jle8048e6b
8048e66:
e866020000call80490d1
8048e6b:
c74424080e0000movl$0xe,0x8(%esp)
8048e72:
00
8048e73:
c7442404000000movl$0x0,0x4(%esp)
8048e7a:
00
8048e7b:
8b45f4mov-0xc(%ebp),%eax
8048e7e:
890424mov%eax,(%esp)
//调用func4函数
8048e81:
e8dafcffffcall8048b60
//当phase_4调用func4时,phase_4中的返回地址被压入栈中,形成Phase4的栈帧的末尾。
Func4从保存栈指针的值开始。
8048e86:
83f801cmp$0x1,%eax
8048e89:
7506jne8048e91
8048e8b:
837df001cmpl$0x1,-0x10(%ebp)
//第二个数不为1则跳转8048e91(爆炸)
//为1则成功跳出
8048e8f:
740cje8048e9d
8048e91:
8db42600000000lea0x0(%esi,%eiz,1),%esi
8048e98:
e834020000call80490d1
8048e9d:
c9leave
8048e9e:
6690xchg%ax,%ax
8048ea0:
c3ret
与之前一样由movl$0x804a23e,0x4(%esp)句来得到要求,要求输入两个数字
分析题目设要求输入的两个数字为x,y,则0<=x<14,y=1.
调用func4函数,故查看func4的代码:
08048b60
8048b60:
55push%ebp
8048b61:
89e5mov%esp,%ebp
8048b63:
83ec18sub$0x18,%esp
8048b66:
895df8mov%ebx,-0x8(%ebp)
8048b69:
8975fcmov%esi,-0x4(%ebp)
//%ebx、%esi是被调用者保存寄存器,func4函数在使用这些寄存器的值之前,必须把他们保存到栈中,并且在返回前回复他们,在本题中保存的这些值没有实际用途。
8048b6c:
8b5508mov0x8(%ebp),%edx
8048b6f:
8b450cmov0xc(%ebp),%eax
8048b72:
8b5d10mov0x10(%ebp),%ebx
8048b75:
89d9mov%ebx,%ecx
8048b77:
29c1sub%eax,%ecx
8048b79:
89cemov%ecx,%esi
//shr是逻辑右移指令
8048b7b:
c1ee1fshr$0x1f,%esi
8048b7e:
8d0c0elea(%esi,%ecx,1),%ecx
8048b81:
d1f9sar%ecx
//sar是算数右移指令,只移位一位,算术右移补最高位
8048b83:
01c1add%eax,%ecx
8048b85:
39d1cmp%edx,%ecx
8048b87:
7e17jle8048ba0
8048b89:
83e901sub$0x1,%ecx
8048b8c:
894c2408mov%ecx,0x8(%esp)
8048b90:
89442404mov%eax,0x4(%esp)
8048b94:
891424mov%edx,(%esp)
8048b97:
e8c4ffffffcall8048b60
8048b9c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Bomblab 实验 报告