拆解二进制炸弹 Defusing a Binary Bomb(深入理解计算机基础)

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

  1. SecureCRT(10.105.222.110)
  2. Linux
  3. Objdump命令反汇编
  4. GDB调试工具

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

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

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

四、实验步骤及实验分析

第一关:
在这里插入图片描述
allq 的两行就是调用 strings_not_equal 和 explode_bomb 这两个函数的,而这里 %esi 对应的是第二个参数,第一个参数就是拆弹时需要输入的字符串了。之后的 test 是用来判断函数的返回值 %eax 是否为 0, 如果为 0 则进行跳转,否则炸弹爆炸,所以实际上要做的,就是看看 %esi这个地址里对应存放的是什么字符串,也就是拆炸弹的关键了。

在这里插入图片描述
用disas调出反汇编代码,stepi一步步执行,就可以看到箭头的变化。直到第二行mov执行完毕为止,直接用 x/s $esi 来看看传进去的到底是什么内容了
在这里插入图片描述
答案出来了!There are many handsome guys and beautiful girls on ShaHe campus.沙河校区有很多帅哥美女哈哈哈!
在这里插入图片描述
第二关:
在这里插入图片描述
从函数名可以得知,这一次要读入六个数字 read_six_numbers。从 cmpl $0x0, (%rsp)看出第一个数字一定是0,不然跳转到27炸弹就爆炸了。然后同理,cmpl $0x1, 0x4(%rsp)看出第二个地址里的数是1。跳转到60,rbx里放第三个数,rbp里放的是最后一个数。跳到34行,可知把第一个数存入了eax,然后eax=eax+第二个数。于是可知,return的是a3=a1+a2,是斐波那契数列。依次计算后三个数,便得0 1 1 2 3 5。在这里插入图片描述这块我傻了,由于太激动,把第二题的答案写在了第一题里,然后炸弹就爆炸了……为什么我手速就这么快的点了c呢!!后悔死我了……
在这里插入图片描述
重新输了一次就对了,进入第三关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值