实验目的:

通过二进制炸弹实验,熟悉汇编语言,反汇编工具objdump以及gdb调试工具。

实验过程:

实验包里有三个文件,分别是二进制可执行文件bomb,C语言源程序文件bomb.c以及一个README-bomblab.txt文件。

分别打开看了一下,C语言源程序文件bomb.c文件不是完整的那种C代码文件,她只是给出了一些入口的指引,用input输入数据,但怎么处理这些输入的参数它并没有显示。然后这三个文件比较有用的就是bomb文件,接下来就利用这个文件来通关。

一、第一关:字符串比较

1、先运行可执行文件bomb,随意输入一些东西,发现程序被引爆,通关密码错误。

2、查看汇编代码分析以找到正确的通关密码,由于直接反汇编查看汇编代码在终端界面的小黑框里不方便看,所以在反汇编的时候直接把汇编文件保存在bomb.s文件中,而后在编译器中查看,发现汇编代码超级长,但是在main函数下发现了它调用了phase_1到phase_6以及phase_defused函数,由此可猜测phase_1到phase_6即为所要找的关卡。

3、一关一关来,进入gdb调试界面,查看phase_1的汇编代码,也可以在bomb.s文件中直接看,但那样要拉到代码下端逐次检索,不太方便,分析phase_1函数的汇编代码发现,它调用了两个函数strings_not_equal和explode_bomb(我也查看了这两个函数的汇编代码,前者在里面两次次调用了string_length函数,猜测是为了实现字符串的比较,总之,从这两个函数里没有分析出很有用的东西),根据单词的字面意思,前者是比较两个字符串是否相等,后者是一个爆炸函数。

以下为strings_not equal函数的汇编代码,大概就是先比较两字符串是否相等,若相等,再逐个比较字符是否一样,一样则字符串相等,反之,直接不等,若字符串相等%eax返回0,否则,返回1:

再接着析phase_1的汇编代码,发现在调用strings_not_equal函数后,进行了test指令,比较%eax与%eax是否位0,若为0则字符串相等跳转到leave,释放栈帧,否则,跳转到explode_bomb函数,程序爆炸。

4、根据上述分析,很容易猜测调用strings_not_equal函数前的指令当中出现的立即数$0x804a15c可疑,极有可能就是strings_not_equal函数的参数输入地址值,尝试打印出此地址处的值(以字符串形式)进行验证。

5、在gdb调试界面运行可执行文件,输入之前打印出的字符串,发现第一个炸弹被拆除,所以,第一关由此就成功通过了。

二、第二关

1、有了第一关的经验,先进入gdb调试界面下,然后查看phase_2的汇编代码,看了一遍代码后发现里面调用了函数read_six_numbers,猜测应该是读入六个数字,而后进行了两次相等跳转和不相等跳转以及两次跳转到explode_bomb函数,到这里就没有什么头绪了。

2、查阅了很多资料后(如查看课本汇编代码各个指令的意思),我对phase_2函数的汇编代码进行了分析,并参考课本P149页开始画了栈帧图,由于草稿纸上画得比较乱,这里只能给一个简洁版。

分析phase_2的汇编代码:

1)、首先栈帧指针%esp、%ebp以及寄存器%esi、%ebx入栈,接着开了48字节(16进制的30等于10进制的48)的内存,栈帧结构中我已经明确标出。

2)、然后令%eax指向%ebp-0x20地址,再令%eax寄存器的值传给%esp+0x4地址,接着把%ebp+0x8间接传给%esp,再调用read_six_numbers函数,此函数应该是参数的输入入口。

接着比较%ebp-0x20地址处的值与0是否相等,若不相等,则跳转到explode_bomb函数处,程序爆炸,为了让程序不爆炸,所以要保证%ebp-0x20地址处的值为0,由此猜测此处存储的值即为参数1。

3)、依次类推,%ebp-0x1c地址处存储参数2,接着分析,发现果然不出所料,函数下一步比较了%ebp-0x1c地址处的值和1是否相等,为了让程序跳转到phase_2+43处执行而不爆炸,则参数2必须为1。

4)、接着令%ebx指向%ebp-0x18地址,%esi指向%ebp-0x8地址,然后让参数1和参数2相加存储在%eax中,接着比较%eax和%ebx中存储的值是否相等,为了让程序不爆炸,则%ebx中存储的值必须为1即参数3。

5)、接下来%ebx寄存器指向原本地址处增加4个字节的地址处,也就是参数4所在地址处,此时已经发现了规律,下一个参数即为上两个参数之和,由此推出参数4、参数5、参数6分别为2、3、5。

6)、当%ebx和%esi不相等时,接着循环,否则,循环结束,用add指令增加栈指针实现空间释放,程序结束。

草稿分析图:

精简图:

3、对分析出的6个参数0、1、1、2、3、5进行验证,成功通关。

总结:

日志写完后我才发现,我似乎没有用太多的gdb调试命令,绝大部分是靠画栈帧图结合汇编代码分析出的结果,希望在之后的通关过程中,我能够更多更好的利用gdb调试工具来辅助完成通关,熟练掌握gdb调试。

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

  1. CSAPP实验二:二进制炸弹(Bomb Lab)

    本系列文章为中国科学技术大学计算机专业学科基础课<计算机系统>布置的实验,上课所用教材和内容为黑书CSAPP,当时花费很大精力和弯路,现来总结下各个实验,本文章为第二个实验--二进制炸弹( ...

  2. 计算机系统原理实验——微程序控制器

    计算机系统原理实验--微程序控制器 一.模拟机的操作 1.程序表 2.执行过程及分析 3.流程图及分析 4.运行结果及分析 二.ROM模块设计 1.VHDL语言设计模块: 三.微程序控制器 1.ROM ...

  3. ZUCC_计算机系统原理实验_大作业 bomb 破解

    浙江大学城市学院实验报告 一.实验目的: 综合掌握程序的机器级表示以及汇编逆向调试过程. 二.实验内容: 二进制炸弹是作为一个目标代码文件提供给学生们的程序,运行时,它提示用户输入6个不同的字符串.如 ...

  4. CSAPP实验——逆向工程拆除“二进制炸弹”程序

    计算机系统基础的实验课,引用了国外的实验,非常好 文章目录 一.实验目的: 二.实验要求 三.实验内容(所修改函数代码,功能以及重要代码的解释): 1.phase_1 2.phase_2 3.phas ...

  5. 湖南大学计算机系统原理实验,湖南大学-计算机组成原理实验-实验3-bomblab_图文.pdf...

    课程实验报告 课 程 名 称: 计算机组成与结构 实验项目名称: bomblab 专 业 班 级: 姓 名: 学 号: 指 导 教 师: 完 成 时 间: 2016 年 4 月 20 日 信息科学与工 ...

  6. 计算机应用乘法,计算机系统原理(十) 二进制整数的乘法运算和除法运算

    2.5我们着重介绍了二进制整数的加.减运算,本次我们继续介绍乘.除运算.本章是迄今为止最难的一章,希望各位猿友有所收获,也别忘了"点个推荐哦". 引言 运算一直是程序运行当中一个重 ...

  7. 实验一-Bomblab(炸弹实验)

    实验概述:该实验就是通过分析汇编代码,并使用GDB调试,找到每一题的通关钥匙    第一关:(key="He is evil and fits easily into most overhe ...

  8. ZUCC_计算机系统原理实验_实验四 数据的存储

    浙江大学城市学院实验报告 一.实验目的: 掌握计算机内部数据存储相关的概念:地址和内容: 掌握常见数据类型的存储宽度: 掌握计算机内部数据存储的顺序: 掌握计算机内部数据存储的对齐方式. 二.实验内容 ...

  9. 计算机进行加法运算的原理,计算机系统原理(九) 二进制整数的加法运算和减法运算...

    引言 平时的编程过程中,当进行整数运算时,经常会遇到一些奇怪的结果,比如两个正数加出负数,两个负数可以加出一个正数,这些都是由于数值表示的有限性导致的.下面我们来看看C语言和Java语言当中的例子. ...

最新文章

  1. OpenDNS 不再向用户展示广告
  2. linux id命令用来查看账户的uid和gid及所属分组及用户名
  3. 程序员终身发展规划---应对中国软件发展的大环境要求
  4. 网易云信携手小天才电话手表 打造视频通话体验的行业标杆
  5. 关于Unity的入门游戏飞机大战的开发(上)
  6. linux内核常用函数或宏
  7. 切片slice(python)
  8. mysql 存储过程 插入记录_mysql 存储过程 插入记录
  9. c语言if case语句怎么用,这样的case和if一起运用有问题吗?
  10. 引入Google新技术 Picasa2发布
  11. 物联网设备接入流程与平台架构
  12. The7主题汉化版-V7.7.0 云典讲堂Wordpress网站模板可视拖拽编辑
  13. FineReport_数据集关联
  14. Ubuntu 视频播放器,弃用SMplayer,选择MPV
  15. WCDMA常见缩略语
  16. Linux下的C编程(一)你好 世界
  17. 知道两点经纬度,计算双方距离与方向的原理
  18. CF 285 E Positions in Permutations 题解
  19. KH7 根据身份证号码判断性别
  20. (五)FTD基于应用的控制

热门文章

  1. PCL官网学习OpenNI Grabber 调用奥比中光Astra s 遇到问题openni2_grabber.cpp @ 325 : No devices connected.
  2. Java 101: Java多态及其类型
  3. 硬盘底座linux,ORICO推出全透明硬盘底座、移动硬盘盒
  4. python自学多久能精通-python多久可以精通
  5. 「JVM 故障诊断」故障分析与处理案例
  6. 关闭和开启笔记本自带键盘。
  7. 异常捕获与自定义迭代器
  8. 上海市医药学校计算机房,上海市医药学校校内比价文件综合楼三楼机房信息发布及广播配套.DOC...
  9. R语言 时间序列arima模型
  10. C#和VB.net语法对比图_C#教程