计系 实验3_逆向工程(拆炸弹)

一、 实验目标与要求:

  1. 理解程序(控制语句、函数、返回值、堆栈结构)是如何运行的
  2. 掌握GDB调试工具和objdump反汇编工具

 

二、实验环境:

  1. 计算机(Intel CPU)
  2. Linux64位操作系统(Ubuntu 17)
  3. GDB调试工具
  4. objdump反汇编工具

 

三、实验方法与步骤:

本实验设计为一个黑客拆解二进制炸弹的游戏。我们仅给黑客(同学)提供一个二进制可执行文件bomb_64和主函数所在的源程序bomb_64.c,不提供每个关卡的源代码。程序运行中有6个关卡(6个phase),每个关卡需要用户输入正确的字符串或数字才能通关,否则会引爆炸弹(打印出一条错误信息,并导致评分下降)!

要求同学运用GDB调试工具和objdump反汇编工具,通过分析汇编代码找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符串来通关。

本实验需解决Phase_1(15)、Phase_2(15)、Phase_3(15)、Phase_4(15)、Phase_5(15)、Phase_6(10)。通过截图+文字的形式把实验过程写在实验报告上,最后并撰写实验结论与心得(15)。

计系 实验3_逆向工程(拆炸弹)_第1张图片

 

四、实验过程及内容:

第一关:

对phase_1进行分析

计系 实验3_逆向工程(拆炸弹)_第2张图片

发现将0x401af8作为第二个参数传入函数,然后返回值=0则跳过爆炸进入下一关。

根据函数的名字可以推测:输入的内容应该与地址0x401af8的字符内容相同,才可能得到返回值=0

猜测可能有点误差,但是基本八九不离十了,但是为了准确一点,我们还是分析一下的汇编代码:

计系 实验3_逆向工程(拆炸弹)_第3张图片

计系 实验3_逆向工程(拆炸弹)_第4张图片

通过对汇编指令的分析,可能得到我们的猜测是正确的,但是,我们还有另外一种验证的方式,那就是设置断点,然后查看eax的值。以下是通过设置断点来验证猜想的方法:

首先我们先随便输入一串字符

然后r指令来到在phase_1函数设置的断点处

计系 实验3_逆向工程(拆炸弹)_第5张图片

来到断点后,使用x/5i $pc查看pc指令后面的汇编代码

Print $eax查看相应寄存器的值

计系 实验3_逆向工程(拆炸弹)_第6张图片

使用ni进行单步执行到函数

计系 实验3_逆向工程(拆炸弹)_第7张图片

然后查看寄存器eax的值,发现eax=1,将会产生爆炸。

接着,我们将0x401af8的内容输入进去,发现eax=0。

计系 实验3_逆向工程(拆炸弹)_第8张图片 

第一关通关成功。

 

第二关

有了第一关的通关经验,第二关也顺利多了,先分析一下phase_2的代码

计系 实验3_逆向工程(拆炸弹)_第9张图片

首先来到是函数,看函数名的意思要求输入6个数字,emm那要不要进去看一下那个函数呢?哈哈发现没什么必要,直接按照猜测能够读懂下面的汇编代码了。

分析结果:

  1. 输入6个数
  2. 数字长度在32位
  3. 前3个数的和不能为=0
  4. 第i个数=第i+3个数

分析完毕:

计系 实验3_逆向工程(拆炸弹)_第10张图片

第二关通过!

 

第三关

这关是关于switch的应用,比较简单,只要把switch表打印出来基本就完成了

首先分析一下汇编代码:

计系 实验3_逆向工程(拆炸弹)_第11张图片

通过对代码分析,可以知道:

  1. 输入两个数字
  2. 第一个数字作为switch表跳转下标的值
  3. 第二个数字则为cmp的值,这个值必须与对应的switch的常数值相等

所以,我们先使用指令x/10gx查看一下跳转表的内容:

计系 实验3_逆向工程(拆炸弹)_第12张图片

所以我们可以得到一下结论:

输入以下两两数字对应的值都可以通过第三关:

{0 535} {1 926} {2 214} {3 339}

{4 119} {5 352} {6 919} {7 212}

第三关通关

 

第四关

进入第四关了,激动的心颤抖的手,离胜利不远了。

按照惯例,打开汇编代码分析一下:

计系 实验3_逆向工程(拆炸弹)_第13张图片

从主代码我们可以得知:

  1. 输入1个数字
  2. 这个数字必须大于0
  3. 把这个数传入一个函数
  4. 得到的返回值=0x37跳过爆炸通关

所以,关键点在func4那里,因此,我们需要分析一下那个函数

计系 实验3_逆向工程(拆炸弹)_第14张图片

通过对代码的解读可以知道,func是个递归函数。

得出结论:输入9时,可以都得到0x37(55)的返回值

第四关通过

 

第五关:

分析代码,这题比较帅,用数组的值作为下标来循环。

计系 实验3_逆向工程(拆炸弹)_第15张图片

通过对汇编代码的理解,可以得知:

  1. 输入两个数
  2. 第1个数的后4位!=0
  3. 第一个数后4位值作为0x401ba0数组的循环开始下标
  4. 数组得到的值为下一次循环的数组的下标
  5. 值=15时跳出循环
  6. 如果循环次数=12,否则爆炸
  7. 每次数组的值=输入的第2个数字的值

所以,关键点来了,那个数组到底藏着什么东西呢?通过x/16w指令,我们可以查看那个数组的值

计系 实验3_逆向工程(拆炸弹)_第16张图片

现在问题来了:

输入下标=?时,使得循环12次后刚好等到数组的值=15

循环12次后的sum=?

经过一系列的乱七八糟的计算得出:初始下标=7,sum=93

因为初始下标是经过0xf^操作的

所以,输入的第1个数只要满足后四位的值=7

即答案为:7  93  (第1一个数可以为7+任意个数的16,比如说7+16=23)

第五关通过

 

第六关

接近胜利了,有一位水货要诞生了

分析一下代码:

计系 实验3_逆向工程(拆炸弹)_第17张图片

得出如下结论:

  1. 输入的值转化为long类型存在602780内存里
  2. 调用函数得到的返回值是一个地址
  3. 返回的地址+24后的值需要=输入的值

现在关键点也出现了,就是fun6.本来想进入fun6的汇编代码去看看,后来直接调试通过了,所以就没那个心思看fun6的汇编代码了

调试过程如下:

  1. 随机输入1个值
  2. 调试运行到cmp %edx , (%rax)
  3. 查看(%rax)的值
  4. 都得到答案

计系 实验3_逆向工程(拆炸弹)_第18张图片

所以,此题我们只需要输入600即可通过次关

计系 实验3_逆向工程(拆炸弹)_第19张图片

第6关通过!降龙十八掌已学会第一招了!

 

你可能感兴趣的:(实验报告)