实验目录:

  • 一、实验目的
  • 二、实验要求
  • 三、实验内容(所修改函数代码,功能以及重要代码的解释)
    • 第一阶段:
    • 第二阶段:
    • 第三阶段:
    • 第四阶段:
    • 第五阶段:
    • 第六阶段:
    • 隐藏阶段:
  • 四、实验结果(在虚拟机中,进行炸弹拆除的截图)
  • 五、实验总结

一、实验目的

  1. 熟悉linux基本操作命令,其中常用工具和程序开发环境
  2. 熟悉反汇编obnjump、调试指令gdb的操作
  3. 熟悉汇编语言中的循环、选择语句,及指针、链表、数组、二分树的应用

二、实验要求

  1. 尽快熟悉linux基本操作命令,还有其中常用工具和程序开发环境。以及objdump、gdb指令
  2. 灵活掌握各种汇编语句,以及查询内存中的信息的方法。
  3. 每个炸弹考察了汇编语言的一个不同方面:阶段一,字符串比较;阶段二,循环;阶段三,条件/分支;阶段四,递归调用和栈;阶段五,指针;阶段六,链表/指针/结构。隐藏阶段只有当在阶段4的拆解字符串后再附加一特定字符串后才会出现(作为最后一个阶段)。

三、实验内容(所修改函数代码,功能以及重要代码的解释)

第一阶段:

密码:I turned the moon into something I call a Death Star.
分析:

根据strings_not_equal函数可以看出,该函数为判断字符串是否相等的函数。如果输入的字符串和%eax里面的字符不相同,则该炸弹爆炸,所以我们通过x/s $eax查看其中的数据,即可得到该阶段的密码。

第二阶段:

密码:0 1 1 2 3 5
分析:
通过分析read_six_numbers函数可得,该阶段的密码为6个数字。

通过分析这几句话可知,我们将%ebp-0x30的地址赋值给%esi。通过查看该值为0。(该值即为第一个数字)
通过分析这两句话得到,该阶段的第二个数字为1。

又根据该循环可知,该值的运算公式为Ni=Ni-1+Ni-2。
所以,经过简单的运算得到该阶段的密码为:0 1 1 2 3 5

第三阶段:

密码:2 560
分析:

通过查看%eax里面的值,可以看出该阶段的密码为两个int类型的数据。又因为cmpl $0x7,-0xc(%ebp)可知第一个数据小于7,所以这里我们可以输入小于7一个数,我在这里输入2。然后通过对函数的可以看出,该函数继续向下执行。当函数执行结束时,我们在通过i r查看%eax的值,此时的值即为第二个数据。由下图我们可以看出,此时%eax的值560。

所以我们可以得出该阶段的密码为:2 560

第四阶段:

密码:5 15 DrEvil(此阶段的密码实际为:5 15,后面加上的DrEvil字符串是为了打开隐藏阶段)
分析:

在调用函数func4之前,我们先查看%eax里面的值,同样可以看出,该阶段的密码仍为两个int类型的数据。
通过这几句函数可以看出,该阶段密码的第二个数字为:0xf,即15。
此时,我们返回fun4函数,查看该函数的执行过程。
经过分析我们可以看出该函数为一个递归函数,此递归函数的执行结果为:
当输入第一个字符为0时:%eax = 11,当输入第一个字符为1时:%eax = 11,
当输入第一个字符为2时:%eax = 13,当输入第一个字符为3时:%eax = 10,
当输入第一个字符为4时:%eax = 19,当输入第一个字符为5时:%eax = 15…
通过观察我们可以得出第一个字符应该为5。综上,该阶段的密码为:5 15

第五阶段:

密码:444422
分析:

分析通过string_length函数,以及cmp $0x6,%eax语句我们可以得知该阶段的密码为六个字符。
之后我们观察到movzbl (%eax),%edx及and $0xf,%edx可知,我们是把输入字符0拓展为32位赋值给%edx再取%edx的后四位。

然后,我们将%eax进行累加并通过cmp %esi,%eax指令将语句进行循环。
另外,我们观察add -0x1c60(%ebx,%edx,4), %ecx,这条语句,可以得出我们是将-0x1c60(%ebx,%edx,4)的地址对应的值赋给%ecx,于是我们通过gdb调试出当%edx分别为0,1,2,3,4,时,-0x1c60(%ebx,%edx,4)地址对应的值:
又根据cmp $0x3c,%ecx可以得出我们输出的%ecx的值为0x3c,即十进制的60,所以通过累加可以计算出60=12+12+12+12+6+6,因此我们可以逆推出该阶段密码为:444422

第六阶段:

密码:1 3 4 6 5 2
分析:

通过这一段代码可知,该阶段密码为六个不大于六的数字。
又通过该循环可以看出,我们输入的六个数分别被7减掉,然后保存在原位置。之后,我们将这些数的地址分别存入不同的地址。存值方式为不断将%edx+0x8。
由此可知,该链表由大到小排列。
根据上述值得到,链表值由大到小排列为:0x352、0x324、0x172、0x166、0x109、0x0bd。
对应的值为:6 4 3 1 2 5
又因为对应的密码是7减去输入数后的值。
故该阶段的密码应为:1 3 4 6 5 2

隐藏阶段:

密码:1001
分析:

根据phase_defused可知,在做完前六个题才可以打开隐藏关卡,且需要在第四个阶段的密码后加入特定的字符串。

通过我们查看得知,该字符串为DrEvil



首先分析secret_phase,由read_line可知,输入的是一个字符串,并且strtol函数是将一个字符串转化为十进制长整数赋给%esi作为返回值,调用func7之前,%eax被赋值为36,即第一个参数a1=0x24,a2为要输入的数。再由func7之后,可以知道返回值是0x7。
通过观察func7内的语句可知,该函数的核心部分是递归。且该递归函数的方式为:

由此可知,最深层的%eax=0,并且如果*a1=a2,则推出最里面的递归条件。 因为 func7 执行完后返回值是 7,而逆推出 7 的产生过程为:


运算完毕后查看结果得知该结果为0x3e9即1001。
所以该阶段的密码为1001

四、实验结果(在虚拟机中,进行炸弹拆除的截图)

五、实验总结

完结撒花
``

计算机系统基础lab2(二进制炸弹实验)相关推荐

  1. 计算机系统基础:bomb炸弹实验

    实验因为根据学号生成,和同学的都不一样,只能独立完成,不过很多大佬的博客提供的思路还是非常有参考价值的. phase1 08048b69 <phase1>:8048b69: 55 push ...

  2. 计算机系统二进制炸弹实验报告,二进制拿炸弹实验报告完整版.doc

    课程名称:计算机系统原理实验 实验课时:32课时 实验项目名称:BombLab二进制炸弹 实验材料:可执行文件bomb.源代码bomb.c.说明README 实验环境:Linux操作系统(安装虚拟机和 ...

  3. 哈工大 计算机系统 二进制炸弹实验报告

    实验报告 实 验(三) 题     目 Binary Bomb 二进制炸弹 专       业 计算机学院 学    号 班    级 学       生 指 导 教 师 实 验 地 点 实 验 日 ...

  4. 哈工大计算机系统Lab2.二进制炸弹

    说明 给定一个可执行目标文件bomb,共有6个阶段,需要用gdb等程序分析反汇编,以获取每个阶段对应的密码.若密码输错则炸弹爆炸.其中一个炸弹可以从这里获取(若提示无法安全下载可以把链接复制到浏览器试 ...

  5. 山东大学 2020级计算机系统原理——拆解二进制炸弹

    写在前面 第一次拿到这个实验还是有点慌!之前没见过,不过还是慢慢做过来了. 这是个需要耐心的过程,请一定静下心来哦! 环境及配置 环境:Ubuntu 20.04 + GDB 调试工具 可参考配置:GD ...

  6. 计算机系统基础:时序逻辑电路实验

    一.实验目的 1.掌握集成触发器的逻辑功能及其应用 2.了解移位控制的功能及其工作原理 二.实验设备与器材 1.+5V直流电源 2.连续脉冲源 3.单次脉冲源 4.逻辑电平开关 5.逻辑电平显示器 6 ...

  7. 计算机系统原理实验之BombLab二进制炸弹1、2关

    实验目的: 通过二进制炸弹实验,熟悉汇编语言,反汇编工具objdump以及gdb调试工具. 实验过程: 实验包里有三个文件,分别是二进制可执行文件bomb,C语言源程序文件bomb.c以及一个READ ...

  8. bomb二进制炸弹拆除实验(MIPS)

    上学期计算机系统基础课程的一个实验,在这里再简略整理一下: 实验要求: 仅给定一个MIPS二进制可执行文件bomb,要求运用GDB调试工具,通过分析反汇编代码来输入正确的参数以拆除炸弹. 辅助工具推荐 ...

  9. 计算机系统基础实验:认识logisim软件、门电路逻辑功能测试(仿真)

    通过logisim对逻辑电路进行分析 文章目录 目录 文章目录 前言 一.使用工具 二.实验过程 1.门电路绘制 2.真值表 总结 前言 计算机系统基础也开了实验课,实验内容是利用logisim软件进 ...

  10. 【计组】二进制炸弹bomblab Phase1-6

    实验目的 通过二进制炸弹实验,熟悉汇编语言 熟悉GDB调试工具 算法思路 编译环境 gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) GNU gdb (U ...

最新文章

  1. Android数据持久化:文件存储
  2. java面向对象基础代码_Java基础语法——面向对象(1)
  3. Android sqlite 数据库保存Date 类型
  4. python使用教程视频-Python入门教程视频分享
  5. ASP.NET实现用户在线检测的类源码[转收藏]
  6. 如何查看node的版本及安装的位置?
  7. mysql无法添加或更新子行_MySQL无法添加或更新子行
  8. java httpclient4_httpclient4使用说明
  9. python面向对象三大特性_深入理解Python面向对象的三大特性
  10. div+css命名大全
  11. Flink 在米哈游的落地实践
  12. Shell总结(整理)
  13. tkinter 中给某个文本加上滚动条_python中wx模块的具体使用方法
  14. Hermite(埃尔米特)插值法
  15. 计算机毕业设计 SSM网上订票系统 飞机订票购票系统 在线订票系统 机票订票系统
  16. 华氏摄氏转换 java_java 摄氏度 华氏度 转换
  17. css动漫效果库,10 个最佳 CSS 动画库
  18. 利用阿里大鱼下发短信验证码
  19. 【GCC编译优化系列】究竟什么样的代码会导致函数调用的栈溢出呢?
  20. 如何反制互联网精准广告定向

热门文章

  1. DRM之Widevine学习入门
  2. chrome浏览器安装印象笔记插件
  3. IIC原理超详细讲解---值得一看
  4. msys2(msys2-i686-20180531)32位下安装GMT4.5.6
  5. Matlab常用函数表
  6. C语言商品超市管理系统课程设计,C语言课程设计超市信息管理系统.doc
  7. 中国象棋matlab
  8. 【转】科普贴:BIOS和UEFI的启动项
  9. android 查看cad方案,安卓手机可以CAD看图吗?怎么查看接收的CAD图纸文件?
  10. 第一章 Maxwell 概述