文件和完整的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
破解过程:
首先根据函数的名字
后面我们可以看见这里面设置了一个循环变量储存在%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