一、实验目的
1.理解C语言程序的机器级表示。
2.初步掌握GDB调试器的用法。
3.阅读C编译器生成的x86-64机器代码,理解不同控制结构生成的基本指令模式,过程的实现。

  • 实验环境
  1. Windows PowerShell(10.120.11.12)
  2. Linux
  3. Objdump命令反汇编
  4. GDB调试工具
  5. 。。。。。

三、实验内容

登录bupt1服务器,在home目录下可以找到Evil博士专门为你量身定制的一个bomb,当运行时,它会要求你输入一个字符串,如果正确,则进入下一关,继续要求你输入下一个字符串;否则,炸弹就会爆炸,输出一行提示信息并向计分服务器提交扣分信息。因此,本实验要求你必须通过反汇编和逆向工程对bomb执行文件进行分析,找到正确的字符串来解除这个的炸弹。

本实验通过要求使用课程所学知识拆除一个“binary bombs”来增强对程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。 “binary bombs”是一个Linux可执行程序,包含了5个阶段(或关卡)。炸弹运行的每个阶段要求你输入一个特定字符串,你的输入符合程序预期的输入,该阶段的炸弹就被拆除引信;否则炸弹“爆炸”,打印输出 “BOOM!!!”。炸弹的每个阶段考察了机器级程序语言的一个不同方面,难度逐级递增。

为完成二进制炸弹拆除任务,需要使用gdb调试器和objdump来反汇编bomb文件,可以单步跟踪调试每一阶段的机器代码,也可以阅读反汇编代码,从中理解每一汇编语言代码的行为或作用,进而设法推断拆除炸弹所需的目标字符串。实验2的具体内容见实验2说明。

四、实验步骤及实验分析

建议按照:准备工作、阶段1、阶段2、¼等来组织内容

各阶段需要有操作步骤、运行截图、分析过程的内容

首先将炸弹解压,用tar -xvf bomb215.tar 命令

拆解完成后进入炸弹文件夹里,

运用gdb调试炸弹,一开始我先将源码打印出来,源码如下

(gdb) list

73          input = read_line();             /* Get input                   */

74          phase_1(input);                  /* Run the phase               */

75          phase_defused();                 /* Drat!  They figured it out!

76                                            * Let me know how they did it. */

77          printf("Phase 1 defused. How about the next one?\n");

78

79          /* The second phase is harder.  No one will ever figure out

80           * how to defuse this... */

81          input = read_line();

82          phase_2(input);

(gdb)

83          phase_defused();

84          printf("That's number 2.  Keep going!\n");

85

86          /* I guess this is too easy so far.  Some more complex code will

87           * confuse people. */

88          input = read_line();

89          phase_3(input);

90          phase_defused();

91          printf("Halfway there!\n");

92

(gdb)

93          /* Oh yeah?  Well, how good is your math?  Try on this saucy problem! */

94          input = read_line();

95          phase_4(input);

96          phase_defused();

97          printf("So you got that one.  Try this one.\n");

100         input = read_line();

101         phase_5(input);

102         phase_defused();

(gdb)

103         printf("Good work!  On to the next...\n");

107         input = read_line();

108         phase_6(input);

109         phase_defused();

(gdb)

113

114         return 0;

115     }

可以看到,第一个炸弹在键盘输入之后会进入phase_1(input) 里面,phase_1会传入我们输入的字符串,而phase_defused() 无参数,因此推断出phase_1 里会判断是否爆炸,而phase_defuse() 则是告知是否拆解炸弹成功

将断点打到phase_1 上,gdb调试进入phase_1 函数里,再查看里面的汇编代码

这个函数在爆炸前会调用<string_not_equal>函数,我们在此处打个断点进入,查看它的汇编代码

这个函数里会接连调用两次<string_length>的函数,因为如果两个字符串长度不同的话,那肯定不是我们想得到的答案。首先进入第一次调用,查看传入的参数,为我们输入的字符串,退出了,再查看第二次调用,x /s $rdi 查看第二次传入的参数,可以看到,此时rdi里的字符串即是本次炸弹的密码。

The bomblab forces students to learn how to use a debugger.

phase_2:

用objdump -d bomb 指令查看汇编代码

之后将这一大串汇编代码复制到文本编辑器里查看,并找到phase_2

phase_2 的前面几句话只是在做调用函数之前的栈缓存和扩容。之后看到调用函数是<read_six_numbers>意味着输入应该是读取6个数字。如果[rsp]里的值等于1 ,则不会爆炸,0x14(%rsp)是把rsp的地址加20,即若把rsp看成数组0号索引,0x14(%rsp) 是rsp[5] ,因为一个int类型大小是4个字节。前一步操作将[rsp] 里为1的值放入%rbx,再把%rbx放入%eax,说明%eax为1,400f7c内存指令将eax乘二了,此时eax为2,然后再比较0x4(%rbx)里的值。如此循环,每次循环eax里的值都会乘2,所以这个数列是1 2 4 8 16 32.

phase_3:

同样来看phase_3的汇编代码

进入<__isoc99_sscanf>函数里查看输入的格式

需要输入一个数字 一个字符 一个数字

400fdd那一行告诉我们输入的数要大于2,否则会爆炸,后面又有一个大于7,也爆炸,因此我选择了3.

jmpq是一个跳转到表的指令,相当于c里的switch。

查看*0x402760里面的数,为0x400ffa,刚好就在下一行$0x139为313  $0x6b 换成ascii码变为k

因此输入答案为3 k 313

phase_4:

下面是phase_4的汇编代码,后面写满了我的注释

同样是查看函数<isoc99_sscanf>函数寄存器里的参数,知道了输入为两个整型。

将汇编代码还原成c语言代码,试运行。从汇编代码中知道第一个参数是9.第一个参数是[rsp],第三个参数是[rsp+4],但是很奇怪的是第三个参数虽然存入了rdx里,但是却没有用。阅读phase_4的汇编代码401186行我知道了输入的一个数必须小于等于4并且大于等于2。将c语言代码运行,得到结果:

改变参数2,3,4,得到结果分别为176,264,352。此时查看phase_4里[rsp]和[rsp+4]的值,发现[rsp]存的是第二个输入的参数,[rsp]为输入的第一个参数。最终得到答案为176 2;264 3;352 4答案有三组。

phase_5:

最开始比较6和<string_length>的返回值,不相等则爆炸,说明输入的必须是6个字符串。之后下面就是一个循环,每次循环都会把输入的第i个字符的低四位字节取出,并将0x4027a0(,%rdx,4)中的值拿出来加到%ecx里。循环六次之后将ecx和$0x36也就是54 比较,如果相等的话就说明通过了。这段其实是一个加密的解密过程,查看0x4027a0数组里的元素,发现一种答案是2+10+10+10+10+12,查看ascii编码表的二进制表,答案既可以是一个0,四个1,一个4的任意组合。顺利通过。

bupt拆解二进制炸弹bomb相关推荐

  1. 二进制拆弹实验详解linux,拆解二进制炸弹

    拆解二进制炸弹 一.实验目的 1.理解C语言程序的机器级表示. 2.初步掌握GDB调试器的用法. 3.阅读C编译器生成的x86-64机器代码,理解不同控制结构生成的基本指令模式,过程的实现. 二. 实 ...

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

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

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

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

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

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

  5. Binary Bomb 二进制炸弹

    实验报告 实 验(三) 题     目 Binary Bomb 二进制炸弹 计算机科学与技术学院 目  录 第1章 实验基本信息... - 3 - 1.1 实验目的... - 3 - 1.2 实验环境 ...

  6. 计算机系统基础实验——拆除二进制炸弹

    实验简要介绍:      该实验是书籍深入理解计算机操作系统中最有趣的实验之一,主要使用 gdb来拆解二进制(或者说程序)的一个文件,了解其运行逻辑.我们对这个程序的了解有: 有六个关卡,分别是 ph ...

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

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

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

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

  9. 二进制炸弹(arm)

    x86上的二进制炸弹对于反汇编的练习来说还是比较经典的,由于网上有很多该程序的讲解,所以在此我打算写一下arm平台上的二进制拆炸弹这个游戏. 环境的搭建 由于是arm平台的环境,所以需要在linux环 ...

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

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

最新文章

  1. 技术图文:匿名方法是怎样演变为Lambda表达试的?
  2. org.hibernate.annotationexception no identifier specified for entity
  3. epoll反应堆模型代码
  4. socket网络编程tcp
  5. 面向对象真的需要继承吗?
  6. 2_less中的数值运算
  7. AOP拦截+权限验证+返回默认接口对象
  8. 分析app和wap手机网站的不同
  9. esphome 中使用bme280读取温度、湿度、气压信息
  10. 关于VMD相关介绍(一)
  11. 双十一不孤单,再过几小时北欧人民也和你一样开始抢单
  12. linux 网卡驱动编译,在linux系统下安装编译网卡驱动的方法
  13. GitBlit(代码提交)
  14. npm ERR! code E404 npm ERR! 404 Not Found - GET https://registry.npmjs.com/address-pares - Not found
  15. 作为通信的学子,怎么在深度学习领域里面发论文
  16. Horde3D——基于C++编写的3D渲染引擎
  17. 解决Ubuntu系统设置打不开
  18. 在html中加入pdf文件吗,如何在网页中显示PDF文件
  19. [笔记分享] [Hardware] MSM8x60 User Guide study report
  20. java 采集新闻数据

热门文章

  1. 浅谈hbase的生态、现状和未来
  2. 真真的手摸手带你实现 vuejs 组件库
  3. 分层领域模型相关总结(DO/PO/VO/BO/DTO/Query等概念)
  4. Java EE - 面向对象基础、string、ArrayLIst练习题
  5. 红帽Linux中出现”This system is not registered with RHN”的解决方案
  6. 从“比从北化”谈企业的研发管理改进
  7. GO开发环境>go version
  8. python爬虫之中国新闻网(简洁版)
  9. 吃不胖的20个小秘密
  10. 为什么是神经网络深度学习