CSAPP第二個實驗bomblab

 

文件和完整的word見github

3.1 阶段1的破解与分析

密码如下:I am not part of the problem. I am a Republican.

        破解过程:

1.首先读主函数的汇编代码

发现这里是用了以一个函数(后面每一个炸弹都是对应的一个函数,在主函数中调用的表现形式一致,后面就不赘述了)

然后找到地址0x400e8d对应的函数

 

发现这里里面是把将立即数0x402470复制到%esi,然后调用一个<判断字符串是否相等的函数>,那么我们可以推理出,判断字符串是否相等这个函数,那么这个字符串其实就放在0x402470里面,如此在GDB中使用x /s 0x402400查看0x402470内存单元中字符串的内容就可以找到密码了。

 

 

3.2 阶段2的破解与分析

密码如下:0 1 3 6 10 15

破解过程:

 

首先根据函数的名字可以判断这是读入6个值,而且保存至从%rsi开始的地址。下面开始第一步就是判断第一个数和0是否相等,那么由此判断,第一个数是0.

 

后面我们可以看见这里面设置了一个循环变量储存在%ebx里面,每循环一次加1操作,然后当等于6的时候跳出循环,而且每次循环的时候会把%ebd里面的值放如%eax,然后每次循环的时候进行累加,即每次都加上这个循环变量,那么第一个数是0,第二个是0+1 = 1,第三个是 1+2 = 3,第四个是3 +3 = 6 ,第五个是 6+4 = 10 ,第六个是 10 +5 = 15

 

 

 

 

3.3 阶段3的破解与分析

密码如下: 0  l 941

破解过程:

 

首先可以看到程序是要读入三个数,分别存0x14(%rsp),0xf(%rsp),0x10(%rsp)里面。根据压栈的顺序,我们知道第一个数存在0x10(%rsp),第二个数是0xf(%rsp),第三个数是0x14(%rsp)。

 

 

%eax是读入数据的返回值即读入数据的个数,如果大于二跳转执行后面,否则进入下一条语句炸弹爆炸。

 

然后第一步就是将第一个数和7比较,如果大于7的话炸弹爆炸,

这里我们知道程序是使用了switch语句,利用跳转表跳到0x4024e0+ %rax * 8的位置,gdb地址使用p/x*(0x4024e0)命令查看当%rax的值为0时跳转地址。

 

 

 

这样我们就知道第一个数据输入为0 时程序跳转到位置(同样的道理可以找到为1-7的地址)。

 

然后我们知道循环里面是吧立即数6c存到了%eax里面,然后将第三个数和0x3ad进行比较,不相等则炸弹爆炸。那么我们就得出了输入的第三个数是0x3ad = 941

在读这个switch语句的时候,我们可以发现,所有的第三个数正确之后都会跳转到同一个地址0x401059执行下一步

这里%al是%eax最后一个字节,我们由是知道这是比较字符相等,此时里面是0x6c,我们查ASCII表得知,它对应的字符是小写字母l,得到第二个答案。

 

 

3.4 阶段4的破解与分析

        密码如下: 6  6

破解过程:

 

首先我们知道,程序是要输入两个数据,

 

 

第一个数据的要求是小于14的

可以看到以上四条语句分别是:调用func4构造参数c,参数值为0xe;为调用func4构造参数b,参数值为0x0;为调用func4构造参数a,参数值为输入第一个参数值;执行func4

 

后面我们知道是用func4的返回值和6进行比较,若是等于6,继续执行,否则炸弹爆炸。下一步就是把第二个数和6比较,等于6跳转。由此我们知道第二个数是6,至于第一个数,我们还需要看fun4函数

 

 

 

 

 

 

 

 

 

 

 

我们知道这是一个递归调用的函数,写成C语言如下:

 

我们需要检查0-14所有满足返回值为6的答案

由此知道,第一个数为6

 

 

 

 

 

 

 

 

 

 

 

 

3.5 阶段5的破解与分析

密码如下:5 115

破解过程:

 

     首先我们知道输入的数至少有2个

 

 

然后我们输入的一个参数的二进制后四位不能为1111(15),也可以相称第一参数的值要小于15。

 

后面我们知道这是是一个循环,寄存器edx初值定为0,每次循环加1,根据后面cmp 0xf, %edx 可以得出,循环必须执行15次;同时ecx寄存器不断的累加数,每次把一个数的值存到eax寄存器中 并且作为下次取值的索引。

而最后我们最终ecx寄存器的累加值要和我们的第二个参数相同,不然炸弹则爆炸。

那么我们来看看如何循环:首先看参与循环的数组,即首地址0x402520数组里面的值

 

我们可以得到如下的一个表格:

 

index

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

value

10

2

14

7

8

12

15

11

0

4

1

13

3

9

6

 

循环必须循环15次,同时循环终止的条件是eax寄存器的值为15.

按照之前分析的:

index为6时对应元素为15,最后一次加了15,那么上一次就加了6,依此类推加15次的结果为: 15+6+14+2+1+10+0+8+4+9+13+11+7+3+12 =115. 第一次的数是12,其index为5.那么由此答案就是5 115

 

 

3.6 阶段6的破解与分析

密码如下:2 4 3 6 5 1

破解过程:

 

        首先我们知道这是读入六个数据,然后建立链表

       这里就是所有数减去一后小于等于5,那么就是所有数在1-6之间。

现在我们要对表示地址的立即数敏感,我们推断,数据地址的首地址是0x6032f0

用gdb查看得知正是1-6六个数

 

将 %rax 指向 %rbx 下一个链表节点, 比较链表节点中第一个字段值的大小,如果前一个节点值小于后一个节点值,跳转。又此我们知道数据是根据每个节点中的第一个数升序排列。那我们可以得知,顺序是 2 4 3 6 5 1

 

 

 

 

为完成本次实验你翻阅的书籍与网站等

[1]  林来兴. 空间控制技术[M]. 北京:中国宇航出版社,1992:25-42.

[2]  辛希孟. 信息技术与信息服务国际研讨会论文集:A集[C]. 北京:中国科学出版社,1999.

[3]  赵耀东. 新时代的工业工程师[M/OL]. 台北:天下文化出版社,1998 [1998-09-26]. http://www.ie.nthu.edu.tw/info/ie.newie.htm(Big5).

[4]  谌颖. 空间交会控制理论与方法研究[D]. 哈尔滨:哈尔滨工业大学,1992:8-13.

[5]  KANAMORI H. Shaking Without Quaking[J]. Science,1998,279(5359):2063-2064.

[6]  CHRISTINE M. Plant Physiology: Plant Biology in the Genome Era[J/OL]. Science,1998,281:331-332[1998-09-23]. http://www.sciencemag.org/cgi/ collection/anatmorp.

[7]https://gitee.com/zhoulee/CSAPP/blob/master/bomb/phase_6.txt

[8]http://xinqiu.me/2016/02/10/csapp-lab2-bomb/

[9]http://www.jianshu.com/p/a3e13a4d8479

[10]http://www.cnblogs.com/remlostime/archive/2011/05/21/2052708.html

转载于:https://www.cnblogs.com/blairwaldorf/p/7783404.html

你可能感兴趣的:(数据结构与算法,c/c++)