华科_计算机系统实验报告

发布时间 : 星期二 文章华科_计算机系统实验报告更新完毕开始阅读

“%d %d”。如图2.5.2所示:

图2.5.2

继续观察phase_5的后一部分反汇编代码,如图2.5.3所示:

图2.5.3

仔细分析发现,首先将第一个输入的值送入eax后与0xf做且运算,然后在与0xf比较,相等就会爆炸,不相等就将[eax*4+0x804a1e0]的值赋给eax,然后直到eax等于0xf,比较进行该赋值的次数,赋值次数也等于0xf且输入的第二个值恰好为赋值后eax的总和,则完成这个炸弹的拆除。

于是执行到phase_5后,用x命令观察0x804a1e0后的连续15个值,如图2.5.4所示:

图2.5.4

由图2.5.4可以列出改数组的值,如表2.5.5: A[0]=10 A[5]=12 A[10]=1 A[1]=2 A[6]=15 A[11]=13 A[2]=14 A[7]=11 A[12]=3 表2.5.5

A[3]=7 A[8]=0 A[13]=9 A[4]=8 A[9]=4 A[14]=6 所以通过反推,要求15次后的eax值必须为0xf也就是15,则反推有15←6←14←2←1←10←0←8←4←9←13←11←7←3←12←5,所以第一个输入的值为5,第二个值为15+6+14+2+1+10+0+8+4+9+13+11+7+3+12=115。

综上,重新执行该程序,直接输入“5 115”,观察结果。如图2.5.6所示:

图2.5.6

4. 实验结果:如图2.5.6所示,阶段五拆弹成功!

阶段五用到了数组,只要正确的找到了数组中元素的值,后面的循环就很简单了。

2.2.6 阶段6 链表/指针/结构

1. 任务描述:通过phase_6的反汇编代码推断第五阶段要输入的数据 2. 实验设计:利用gdb结合断点来动态地分析 3. 实验过程:

观察phase_6的前一部分反汇编代码,如图2.6.1所示:

图2.6.1

仍然是读取六个数字,输入“0 1 2 3 4 5”测试,然后在read_six_numbers返回后观察数字是否被存放在[esp+0x10]处,如图2.6.2所示:

图2.6.2

所以这段代码还对输入的值有一定的要求,要求减去以后必须不能大于5,即要在1、2、3、4、5、6中的数字才可以。继续看phase_6的下一段反汇编代

码,如图2.6.3所示。

图2.6.3

不难发现这是通过esi与ebx来实现的双重循环,一一比较输入的值是否相同,只要有一对相同该炸弹就会爆炸,所以输入的数据应该是1到6的一种排列才可以。继续看phase_6的下一段反汇编代码,如图2.6.4所示。

图2.6.4

发现出现了一个奇怪的地址,用x命令观察一下,如图2.6.5所示:

图2.6.5

很容易发现是一个节点,用x命令将该链表所有节点全部罗列出来,如图2.6.6所示:

图2.6.6

根据该链表并继续观察代码,仔细大胆猜测这段代码是根据输入的序列,将链表的顺序进行改排。然后再判断改排后的链表中的数据是否是从小到大进行排序的。

所以不妨大胆的猜测应该输入的排序序列应该为4(0x3e) <5(0x1bc) <2(0x263) <3(0x2bc) <6(0x37a) <1(0x3dc)。故猜测输入的字符串应该为“4 5 2 3 6 1”,重新运行程序,输入该字符串进行测试,如图2.6.7所示:

图2.6.7

4. 实验结果: 如图2.6.7所示,阶段六拆弹成功!

阶段六难度大大加大,由于有大量的地址的操作,所以乍一看很难看懂功能,查看相应地址后发现是个链表,在结合反汇编代码,很容易能猜测出大概的功能,从而来推测正确的输入。

2.2.7 阶段7 隐藏阶段

1. 任务描述:找出隐藏阶段开启方式并且拆除隐藏阶段的炸弹。 2. 实验设计:利用gdb结合断点来动态地分析 3. 实验过程:

直接在反汇编代码中观察发现,只有phase_defused函数中有对secret_phase函数的调用,于是观察phase_defused函数的反汇编代码,如图2.7.1所示:

观察不难发现,要经过两个比较,以及一个字符串比较后才能开启隐藏阶段。而第一个比较是一个数与常数0x6的比较,结合隐藏阶段的开启条件,必须在阶段6完成后才能开启就很容易发现,这个数(ds:0x804c3c8)应该就是用来指示当前阶段的。于是在phase_6完成后,在phase_defused处下断点,观察ds:0x804c3c8处的值,如图2.7.2所示:

联系合同范文客服:xxxxx#qq.com(#替换为@)