ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:46.37KB ,
资源ID:29656257      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29656257.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(拆炸弹实验报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

拆炸弹实验报告.docx

1、拆炸弹实验报告 Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998拆炸弹实验报告课程实验报告 课 程 名 称: 计算机组成与结构 实 验 名 称: 拆炸弹 专 业 班 级: 姓 名: 学 号: 完 成 时 间: (一)实验目的:程序运行中有6个关卡(6个phase),每个phase需要用户在终端上输入特定的字符或者数字才能通关,否则会引爆炸弹!那么如何才能知道输入什么内容呢这需要你使用gdb工具反汇编出汇编代码,结合c语言文件找到每个关卡的入口函数。然后分析汇编代码,找到在每个phase程序段中,引导程序跳转到“explode_bomb”

2、程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符通关。(二)实验环境:虚拟机ubuntu系统下32位操作系统,终端,gdb工具。(三)实验目的和操作:拆炸弹准备操作:查看给出的中的代码,得知控制检测密码正误的6个函数分别为:phase_1,phase_2,phase_3,phase_4,phase_5,phase_6。使用gbd工具对可执行文件bomb进行反汇编:打开bomb可执行文件所在的文件夹输入反汇编命令objdump -d bomb后,出现了大量汇编代码,在终端窗口可以看到很多行的汇编代码。也可以使用汇编指令objdump -d bomb 将汇编代码输出到

3、服务器上一个自动生成的叫的文件中。开始拆炸弹::的反汇编代码如下:0x08048f61 : push %ebp0x08048f62 : mov %esp,%ebp0x08048f64 : sub $0x18,%esp0x08048f67 : movl 0x804a15c,0x4(%esp) 结果为:结果正确。反汇编代码如下:0x08048d6a : push %ebp0x08048d6b : mov %esp,%ebp0x08048d6d : push %esi0x08048d6e : push %ebx0x08048d6f : sub $0x30,%esp0x08048d72 : lea -

4、0x20(%ebp),%eax0x08048d75 :mov %eax,0x4(%esp)0x08048d79 :mov 0x8(%ebp),%eax0x08048d7c : mov %eax,(%esp)0x08048d7f : call 0x804910b 读取六个数字0x08048d84 :cmpl $0x0,-0x20(%ebp) 0和第一个数字比较,不相等则爆炸。0x08048d88 :jne 0x8048d90 0x08048d8a : cmpl $0x1,-0x1c(%ebp) 1和第二个数字比较,相等则跳过爆炸。0x08048d8e :je 0x8048d95 0x08048d

5、90 :call 0x80490d1 0x08048d95 :lea -0x18(%ebp),%ebx ebx指向第三个数字。0x08048d98 :lea -0x8(%ebp),%esi esi指向第六个数字再向后移一位的地址。0x08048d9b :mov -0x4(%ebx),%eax ebx向前第一位的数字赋给eax。0x08048d9e :add -0x8(%ebx),%eax eax再加上ebx向前第二位的数字。0x08048da1 : cmp %eax,(%ebx) 比较ebx前两位的和与ebx指向的数字。0x08048da3 : je 0x8048daa 相等则跳过爆炸(exp

6、lode_bomb)0x08048da5 : call 0x80490d1 0x08048daa : add $0x4,%ebx ebx地址向后移动一位(四个字节)。0x08048dad :cmp %esi,%ebx 如果还未超过第六位数字,则跳转0x8048d9行。0x08048daf : jne 0x8048d9b 0x08048db1 :add $0x30,%esp0x08048db4 :pop %ebx0x08048db5 :pop %esi0x08048db6 :pop %ebp0x08048db7 :ret 从上面的代码分析可知:phase_2的密码需要输入六位数字,并且第一个是0

7、,第二个是1,然后执行到0x8048d9b这一行代码发现往下运行会出现一个循环,两条重要指令是imull -0x4(%esi,%edx,4),%eax 和cmp %eax,(%esi,%edx,4),其中%eax 和%edx在每次循环中加1直到寄存器中值超过6,程序执行完毕。在循环中执行的是一个数等于前两个数之和,寄存器ebx每次循环将向前第一位的数字赋给寄存器eax。从而实现了计算前6位的斐波那契数列的值为:0 1 1 2 3 5。执行结果如下:反汇编代码如下:0x08048ea1 : push %ebp0x08048ea2 : mov %esp,%ebp0x08048ea4 : sub $

8、0x28,%esp0x08048ea7 : lea -0x10(%ebp),%eax0x08048eaa : mov %eax,0 xc(%esp) 此处为第二个数字。0x08048eae : lea -0xc(%ebp),%eax0x08048eb1 :mov %eax,0x8(%esp) 此处为第一个数字。0x08048eb5 :movl $0x804a23e,0x4(%esp) 用x/s 0x804a23e命令查看$0x804a23e为0x08048ebd :mov 0x8(%ebp),%eax %d %d,即要输入两个整数,上面已经指出。0x08048ec0 : mov %eax,(%

9、esp)0x08048ec3 : call 0x8048840 0x08048ec8 : cmp $0x1,%eax 以上两行即要求输入至少两组数据,否则引爆。0x08048ecb : jg 0x8048ed2 0x08048ecd : call 0x80490d1 0x08048ed2 :cmpl $0x7,-0xc(%ebp) 第一个数大于7引爆,即第一个数小于等于7。0x08048ed6 :ja 0x8048f43 0x08048ed8 :mov -0xc(%ebp),%eax0x08048edb :jmp *0x804a1a0(,%eax,4) 跳转至0x804a1a0+eax*4(第

10、一个数)内数据所0x08048ee2 : mov $0x0,%eax 指的行数。0x08048ee7 : jmp 0x8048f3c 0x08048ee9 : mov $0x0,%eax0x08048eee : xchg %ax,%ax0x08048ef0 : jmp 0x8048f37 0x08048ef2 : mov $0x0,%eax0x08048ef7 : jmp 0x8048f32 0x08048ef9 : mov $0x0,%eax0x08048efe : xchg %ax,%ax0x08048f00 : jmp 0x8048f2d 0x08048f02 : mov $0x0,%e

11、ax0x08048f07 :jmp 0x8048f28 0x08048f09 :mov $0x0,%eax0x08048f0e :xchg %ax,%ax0x08048f10 :jmp 0x8048f23 0x08048f12 :mov $0x314,%eax 当第一个数为0时跳转到此处,第二个数x=788。0x08048f17 :jmp 0x8048f1e 跳转到0x8048f1e。0x08048f19 :mov $0x0,%eax0x08048f1e :sub $0x35a,%eax x=x-8580x08048f23 :add $0x2ef,%eax x=x+7510x08048f28

12、:sub $0x216,%eax x=x-5340x08048f2d :add $0x216,%eax x=x+5340x08048f32 :sub $0x216,%eax x=x-5340x08048f37 :add $0x216,%eax x=x+5340x08048f3c :sub $0x216,%eax x=x-5340x08048f41 :jmp 0x8048f4d 跳转到0x8048f4d行。0x08048f43 :call 0x80490d1 0x08048f48 :mov $0x0,%eax 0x08048f4d :cmpl $0x5,-0xc(%ebp) 第一个数大于5引爆,

13、即第一个数小于等于5。0x08048f51 :jg 0x8048f58 0x08048f53 :cmp -0x10(%ebp),%eax 第一个数是0时,算得x=147,即第二个数0x08048f56 :je 0x8048f5d 为147。0x08048f58 :call 0x80490d1 0x08048f5d :leave 0x08048f5e : xchg %ax,%ax0x08048f60 :ret 从以上分析可知:再往下然后看到jmp输入指令x/s 0x8049abb,得到0x8049abb:%d %d,显示出应该输入两个数字。如果输入不满足两个数,则会引爆炸弹,并且第二个与第一个数

14、的值相关。第一个值得范围为0-5的整数,当第一个数输入的不是0-5的整数,也会引爆炸弹。输入的第一个数存入在寄存器eax中,并且根据跳转指令jmp *0x804a1a0(,%eax,4)选择将要跳转的位置,执行相应的代码计算出第二个需要输入的值。1)当第一个数输入的是0,eax寄存器中对应的值为0,则跳转到指令*0x804a1a0用指令查看*0x804a1a0的值为:发现*0x804a1a0对应的值为0x8048f12,找到0x08048f12对应的代码执行发现第二个数计算得结果为:x = 0x(314-35a 2ef 216 +216-216+216-216 + ) = 1472)当输入的第

15、一个数是1时,同理用指令查看*(0x804a1a0+4)的值为则代码从0x08048f19对应的代码执行第二个数计算得结果为:x = 0x(-35a 2ef 216 +216-216+216-216 + ) = -6413)同理输入2,3,4,5对应的第二个数字为:217,534,0,-534结果打印为:反汇编代码如下:0x08048e2e : push %ebp0x08048e2f : mov %esp,%ebp0x08048e31 : sub $0x28,%esp0x08048e34 : lea -0x10(%ebp),%eax0x08048e37 : mov %eax,0xc(%esp)

16、 此处第二段数字。0x08048e3b :lea -0xc(%ebp),%eax0x08048e3e : mov %eax,0x8(%esp) 此处第一段数字。0x08048e42 : movl $0x804a23e,0x4(%esp) $0x804a23e内为%d %d,即输入两个整数。0x08048e4a : mov 0x8(%ebp),%eax0x08048e4d :mov %eax,(%esp)0x08048e50 : call 0x8048840 0x08048e55 : cmp $0x2,%eax 以上两行要求之前输入的为两个数据,否则引爆。0x08048e58 : jne 0x8

17、048e66 0x08048e5a : mov -0xc(%ebp),%eax0x08048e5d :test %eax,%eax 第一段数据大于等于0,否则引爆。0x08048e5f : js 0x8048e66 0x08048e61 : cmp $0xe,%eax 第一段数据小于等于14时跳过引爆。0x08048e64 : jle 0x8048e6b 0x08048e66 : call 0x80490d1 0x08048e6b :movl $0xe,0x8(%esp)0x08048e73 : movl $0x0,0x4(%esp)0x08048e7b :mov -0xc(%ebp),%ea

18、x0x08048e7e : mov %eax,(%esp)0x08048e81 : call 0x8048b60 这几行为运行一个递归函数func4来确定第一0x08048e86 : cmp $0x1,%eax 段数据的值。0x08048e89 : jne 0x8048e91 0x08048e8b :cmpl $0x1,-0x10(%ebp) 第二个数据等于1则跳过爆炸。0x08048e8f : je 0x8048e9d 0x08048e91 : lea 0x0(%esi,%eiz,1),%esi0x08048e98 :call 0x80490d1 0x08048e9d :leave 0x08

19、048e9e :xchg %ax,%ax0x08048ea0 :ret 以上对代码的分析可以看出,第二个数据确定为1。第一个数据范围为大于等于0,小于14,并且由一个递归函数func4又一次缩小了范围。但因为这个递归函数太过繁杂,而第一个数据范围又不大,直接将第一个数据从0尝试到13,得到了三个数字8、9、11符合要求。因此密码有三组:8 1,9 1,11 1。反汇编代码如下:0x08048db8 : push %ebp0x08048db9 : mov %esp,%ebp0x08048dbb : push %esi0x08048dbc : push %ebx0x08048dbd : sub $

20、0x20,%esp0x08048dc0 : lea -0x10(%ebp),%eax0x08048dc3 : mov %eax,0xc(%esp) 此处为第二个数。0x08048dc7 : lea -0xc(%ebp),%eax0x08048dca : mov %eax,0x8(%esp) 此处为第一个数。0x08048dce : movl $0x804a23e,0x4(%esp) $0x804a23e内为%d %d,即输入两个整数。0x08048dd6 :mov 0x8(%ebp),%eax0x08048dd9 :mov %eax,(%esp)0x08048ddc : call 0x8048

21、840 0x08048de1 :cmp $0x1,%eax 以上两行保证输入数据多于1组,否则引爆。0x08048de4 :jg 0x8048deb 0x08048de6 :call 0x80490d1 0x08048deb :mov -0xc(%ebp),%eax0x08048dee : and $0xf,%eax 按位与,即保留第一个数的后四位。0x08048df1 : mov %eax,-0xc(%ebp)0x08048df4 : cmp $0xf,%eax 第一个数二进制后四位不能为(1111)2,否则引爆。0x08048df7 : je 0x8048e22 0x08048df9 :

22、mov $0x0,%ecx0x08048dfe : mov $0x0,%edx0x08048e03 : mov $0x804a1c0,%ebx $0x804a1c0指向的是一个数组,下面分析。0x08048e08 : add $0x1,%edx0x08048e0b :mov (%ebx,%eax,4),%eax0x08048e0e : add %eax,%ecx0x08048e10 : cmp $0xf,%eax0x08048e13 : jne 0x8048e08 以上五行为一个for循环语句, 0x08048e15 : mov %eax,-0xc(%ebp) 0x08048e18 : cmp

23、 $0xf,%edx 上述的for循环要循环15次。0x08048e1b :jne 0x8048e22 0x08048e1d :cmp %ecx,-0x10(%ebp) 确定第二个数的值,下面分析。0x08048e20 :je 0x8048e27 0x08048e22 :call 0x80490d1 0x08048e27 :add $0x20,%esp0x08048e2a :pop %ebx0x08048e2b :pop %esi0x08048e2c :pop %ebp0x08048e2d :ret 从代码的分析中可知:需要输入两个数,并且第一个数的后四位不能为1111,若为1111则引爆炸弹

24、。在程序中我们会遇到一个给定值0x804a1c0。我们可以查看其值为:查看16个值,因为发现后面的循环中需要循环遍历使用16个数。其中最难懂的代码就是0x08048e0b :mov (%ebx,%eax,4),%eax这一行代码,ebx对应的是0x804a1c0对应的首地址。这句话的意思解释为C语言的意思就是 n = an。寄存器ecx保存的是计算得sum的总值。这段代码翻译成c语言类似于:sum=0;for(i=1;n=15;i+) n=an; sum+=n;其中第一次n取的值应为用户输入的第一个数二进制下的后四位。之后每次都等于an,sum为除去第一次之外所有n取值的和。采用逆推的方法来求

25、出n第一次取的值。序号0123456789101112131415数组1021478121511041133965for循环当n为15时终止,因此最后一个n为15,对应序号为上一个n,即6。同理,可以得到,n从第一个到最后一个为:5 12 3 7 11 13 9 4 8 0 10 1 2 14 6 15。sum=15*16/2-5=115。即用户输入的第二个数为115。用户输入第一个数二进制下的后四位为0101(即第一个n=5),由于第一位只要满足输入的数的后四位不为1111,第二个数为115即可,如:10 115,5 1 15。反汇编代码如下:0x08048c89 : push %ebp0x

26、08048c8a : mov %esp,%ebp0x08048c8c : push %edi0x08048c8d : push %esi0x08048c8e : push %ebx0x08048c8f : sub $0x5c,%esp0x08048c92 : lea -0x30(%ebp),%eax0x08048c95 : mov %eax,0x4(%esp)0x08048c99 : mov 0x8(%ebp),%eax0x08048c9c : mov %eax,(%esp)0x08048c9f : call 0x804910b 0x08048ca4 : mov $0x0,%esi0x08048ca9 : lea -0x30(%ebp),%edi0x08048cac : mov (%edi,%esi,4),%eax 第esi+1个数给eax。开始

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1