升入理解计算机系统Bomb-LAB实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

湖南大学课程实验报告课程名称:计算机组成与结构实验项目名称:二进制炸弹专业班级:姓名:学号:指导教师:完成时间:计算机科学与工程系实验题目:APPBombLab实验目的:实验环境:linux,终端,gdb工具实验内容及操作步骤:查看给出的bomb.c中的代码,得知控制检测密码正误的6个函数分别为:phase_1,phase_2,phase_3,phase_4,phase_5,phase_6。使用gbd工具对可执行文件bomb进行反汇编:得到六段汇编代码,将其复制成文本后,对其进行分析,phase_1代码:0x08048f61+0:push%ebp0x08048f62+1:mov%esp,%ebp0x08048f64+3:sub$0x18,%esp0x08048f67+6:movl$0x804a15c,0x4(%esp)将esp寄存器地址指向$0x804a15c0x08048f6f+14:mov0x8(%ebp),%eax将$0x804a15c中的数据移给eax寄存器0x08048f72+17:mov%eax,(%esp)0x08048f75+20:call0x8048fabstrings_not_equal0x08048f7a+25:test%eax,%eax上一行与这一行比较用户输入和$0x804a15c中的值0x08048f7c+27:je0x8048f83phase_1+340x08048f7e+29:call0x80490d1explode_bomb0x08048f83+34:leave0x08048f84+35:ret可以看出,phase_1的密码是固定储存在$0x804a15c中的。令$0x804a15c中的数据与用户输入的数据比较,若相同则跳过explode_bomb,避开炸弹。用命令x/s0x804a15c查看其中的数据如下因此知道第一个密码为:WehavetostandwithourNorthKoreanallies.phase_2代码:0x08048d6a+0:push%ebp0x08048d6b+1:mov%esp,%ebp0x08048d6d+3:push%esi0x08048d6e+4:push%ebx0x08048d6f+5:sub$0x30,%esp0x08048d72+8:lea-0x20(%ebp),%eax0x08048d75+11:mov%eax,0x4(%esp)0x08048d79+15:mov0x8(%ebp),%eax0x08048d7c+18:mov%eax,(%esp)0x08048d7f+21:call0x804910bread_six_numbers读取六个数字0x08048d84+26:cmpl$0x0,-0x20(%ebp)0和第一个数字比较,不相等则爆炸。0x08048d88+30:jne0x8048d90phase_2+380x08048d8a+32:cmpl$0x1,-0x1c(%ebp)1和第二个数字比较,相等则跳过爆炸。0x08048d8e+36:je0x8048d95phase_2+430x08048d90+38:call0x80490d1explode_bomb0x08048d95+43:lea-0x18(%ebp),%ebxebx指向第三个数字。0x08048d98+46:lea-0x8(%ebp),%esiesi指向第六个数字再向后移一位的地址。0x08048d9b+49:mov-0x4(%ebx),%eaxebx向前第一位的数字赋给eax。0x08048d9e+52:add-0x8(%ebx),%eaxeax再加上ebx向前第二位的数字。0x08048da1+55:cmp%eax,(%ebx)比较ebx前两位的和与ebx指向的数字。0x08048da3+57:je0x8048daaphase_2+64相等则跳过爆炸(explode_bomb)0x08048da5+59:call0x80490d1explode_bomb0x08048daa+64:add$0x4,%ebxebx地址向后移动一位(四个字节)。0x08048dad+67:cmp%esi,%ebx如果还未超过第六位数字,则跳转到0x8048d9b行。0x08048daf+69:jne0x8048d9bphase_2+490x08048db1+71:add$0x30,%esp0x08048db4+74:pop%ebx0x08048db5+75:pop%esi0x08048db6+76:pop%ebp0x08048db7+77:ret从上面的代码分析中可以知道,phase_2的密码有六个数字,第一个是0,第二个是1,然后之后的每位都是前两位的和,即斐波拉契数列的前6位。所以密码是:011235。phase_3代码:0x08048ea1+0:push%ebp0x08048ea2+1:mov%esp,%ebp0x08048ea4+3:sub$0x28,%esp0x08048ea7+6:lea-0x10(%ebp),%eax0x08048eaa+9:mov%eax,0xc(%esp)此处为第二个数字。0x08048eae+13:lea-0xc(%ebp),%eax0x08048eb1+16:mov%eax,0x8(%esp)此处为第一个数字。0x08048eb5+20:movl$0x804a23e,0x4(%esp)用x/s0x804a23e命令查看$0x804a23e为0x08048ebd+28:mov0x8(%ebp),%eax%d%d,即要输入两个整数,上面已经指出。0x08048ec0+31:mov%eax,(%esp)0x08048ec3+34:call0x8048840__isoc99_sscanf@plt0x08048ec8+39:cmp$0x1,%eax以上两行即要求输入至少两组数据,否则引爆。0x08048ecb+42:jg0x8048ed2phase_3+490x08048ecd+44:call0x80490d1explode_bomb0x08048ed2+49:cmpl$0x7,-0xc(%ebp)第一个数大于7引爆,即第一个数小于等于7。0x08048ed6+53:ja0x8048f43phase_3+1620x08048ed8+55:mov-0xc(%ebp),%eax0x08048edb+58:jmp*0x804a1a0(,%eax,4)跳转至0x804a1a0+eax*4(第一个数)内数据所0x08048ee2+65:mov$0x0,%eax指的行数。0x08048ee7+70:jmp0x8048f3cphase_3+1550x08048ee9+72:mov$0x0,%eax0x08048eee+77:xchg%ax,%ax0x08048ef0+79:jmp0x8048f37phase_3+1500x08048ef2+81:mov$0x0,%eax0x08048ef7+86:jmp0x8048f32phase_3+1450x08048ef9+88:mov$0x0,%eax0x08048efe+93:xchg%ax,%ax0x08048f00+95:jmp0x8048f2dphase_3+1400x08048f02+97:mov$0x0,%eax0x08048f07+102:jmp0x8048f28phase_3+1350x08048f09+104:mov$0x0,%eax0x08048f0e+109:xchg%ax,%ax0x08048f10+111:jmp0x8048f23phase_3+1300x08048f12+113:mov$0x314,%eax当第一个数为0时跳转到此处,第二个数x=788。0x08048f17+118:jmp0x8048f1ephase_3+125跳转到0x8048f1e。0x08048f19+120:mov$0x0,%eax0x08048f1e+125:sub$0x35a,%eaxx=x-8580x08048f23+130:add$0x2ef,%eaxx=x+7510x08048f28+135:sub$0x216,%eaxx=x-5340x08048f2d+140:add$0x216,%eaxx=x+5340x08048f32+145:sub$0x216,%eaxx=x-5340x08048f37+150:add$0x216,%eaxx=x+5340x08048f3c+155:sub$0x216,%eaxx=x-5340x08048f41+160:jmp0x8048f4dphase_3+172跳转到0x8048f4d行。0x08048f43+162:call0x80490d1explode_bomb0x08048f48+167:mov$0x0,%eax0x08048f4d+172:cmpl$0x5,-0xc(%ebp)第一个数大于5引爆,即第一个数小于等于5。0x08048f51+176:jg0x8048f58phase_3+1830x08048f53+178:cmp-0x10(%ebp),%eax第一个数是0时,算得x=147,即第二个数0x08048f56+181:je0x8048f5dphase_3+188为147。0x08048f58+183:call0x80490d1explode_bomb0x08048f5d+188:leave0x08048f5e+189:xchg%ax,%ax0x08048f60+191:ret由以上分析可以得到,我们需要输入两个数,储存在%ebx-16和%edx-12中,%edx为输入的第一个数据,由0x08048f4d+172:cmpl$0x5,-0xc(%ebp)可以判断第一个数输入不能大于5,即可以输入6组数据0,1,2,3,4,5,他们应该分别对应一个%edx-16的值!假设第二个一个输入的数为x:当输入第一个数为0时,x=788-858+751-534+534-534+534-534=147当输入第一个数为1时,x=-858+751-534+534-534+534-534=-641当输入第一个数为2时,x=751-534+534-534+534-534=217当输入第一个数为3时,x=-534+534-534+534-534=-534当输入第一个数为4时,x=534-534+534-534=0当输入第一个数为5时,x=-534+534-534=-534所以,可以输入的六组数据分别为:0,1471,-6412,2173,-5344,05,-534phase_4代码:0x08048e2e+0:push%ebp0x08048e2f+1:mov%esp,%ebp0x08048e31+3:sub$0x28,%esp0x08048e34+6:lea-0x10(%ebp),%eax0x08048e37+9:mov%eax,0xc(%esp)此处第二段数字。0x08048e3b+13:lea-0xc(%ebp),%eax0x08048e3e+16:mov%eax,0x8(%esp)此处第一段数字。0x08048e42+20:movl$0x804a23e,0x4(%esp)$0x804a23e内为%d%d,即输入两个整数。0x08048e4a+28:mov0x8(%ebp),%ea

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功