|
一、 实验目标与要求:
|
|
二、实验环境:
|
|
三、实验方法与步骤: 本实验设计为一个黑客拆解二进制炸弹的游戏。我们仅给黑客(同学)提供一个二进制可执行文件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分)。
|
|
四、实验过程及内容: 第一关: 对phase_1进行分析 发现将0x401af8作为第二个参数传入函数,然后返回值=0则跳过爆炸进入下一关。 根据函数的名字可以推测:输入的内容应该与地址0x401af8的字符内容相同,才可能得到返回值=0 猜测可能有点误差,但是基本八九不离十了,但是为了准确一点,我们还是分析一下<strings_not_equal>的汇编代码: 通过对<strings_not_equal>汇编指令的分析,可能得到我们的猜测是正确的,但是,我们还有另外一种验证的方式,那就是设置断点,然后查看eax的值。以下是通过设置断点来验证猜想的方法: 首先我们先随便输入一串字符 然后r指令来到在phase_1函数设置的断点处 来到断点后,使用x/5i $pc查看pc指令后面的汇编代码 Print $eax查看相应寄存器的值 使用ni进行单步执行到函数<strings_not_equal> 然后查看寄存器eax的值,发现eax=1,将会产生爆炸。 接着,我们将0x401af8的内容输入进去,发现eax=0。
第一关通关成功。
第二关 有了第一关的通关经验,第二关也顺利多了,先分析一下phase_2的代码 首先来到是函数<read_six_numbers>,看函数名的意思要求输入6个数字,emm那要不要进去看一下那个函数呢?哈哈发现没什么必要,直接按照猜测能够读懂下面的汇编代码了。 分析结果:
分析完毕: 第二关通过!
第三关 这关是关于switch的应用,比较简单,只要把switch表打印出来基本就完成了 首先分析一下汇编代码: 通过对代码分析,可以知道:
所以,我们先使用指令x/10gx查看一下跳转表的内容: 所以我们可以得到一下结论: 输入以下两两数字对应的值都可以通过第三关: {0 535} {1 926} {2 214} {3 339} {4 119} {5 352} {6 919} {7 212} 第三关通关
第四关 进入第四关了,激动的心颤抖的手,离胜利不远了。 按照惯例,打开汇编代码分析一下: 从主代码我们可以得知:
所以,关键点在func4那里,因此,我们需要分析一下那个函数 通过对代码的解读可以知道,func是个递归函数。 得出结论:输入9时,可以都得到0x37(55)的返回值 第四关通过
第五关: 分析代码,这题比较帅,用数组的值作为下标来循环。 通过对汇编代码的理解,可以得知:
所以,关键点来了,那个数组到底藏着什么东西呢?通过x/16w指令,我们可以查看那个数组的值 现在问题来了: 输入下标=?时,使得循环12次后刚好等到数组的值=15 循环12次后的sum=? 经过一系列的乱七八糟的计算得出:初始下标=7,sum=93 因为初始下标是经过0xf^操作的 所以,输入的第1个数只要满足后四位的值=7 即答案为:7 93 (第1一个数可以为7+任意个数的16,比如说7+16=23) 第五关通过
第六关 接近胜利了,有一位水货要诞生了 分析一下代码: 得出如下结论:
现在关键点也出现了,就是fun6.本来想进入fun6的汇编代码去看看,后来直接调试通过了,所以就没那个心思看fun6的汇编代码了 调试过程如下:
所以,此题我们只需要输入600即可通过次关 第6关通过!降龙十八掌已学会第一招了!
|
相关文章: