CSAPP第二個實驗bomblab

 

文件和完整的word見github

3.1 阶段1的破解与分析

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

破解过程:

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

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

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

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

3.2 阶段2的破解与分析

密码如下:0 1 3 6 10 15

破解过程:

首先根据函数的名字<read_six_numbers>可以判断这是读入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

时间: 2024-10-24 05:29:31

CSAPP第二個實驗bomblab的相关文章

學習 React.js:用 Node 和 React.js 創建一個實時的 Twitter 流

Build A Real-Time Twitter Stream with Node and React.js By Ken Wheeler (@ken_wheeler) 簡介 歡迎來到學習 React 的第二章,該系列文章將集中在怎麼熟練並且有效的使用臉書的 React 庫上.如果你沒有看過第一章,概念和起步,我非常建議你繼續看下去之前,回去看看. 今天我們準備創建用 React 來創建一個應用,通過 Isomorphic Javascript. Iso-啥? Isomorphic. Java

實驗二

#include"stdio.h" #include"stdlib.h" typedef struct PCB //定义进程控制块 { char ID[3]; //进程号 char name[10]; //进程名 char state; //运行状态 int arrivetime; //到达时间 int starttime; //进程开始时间 int finishtime; //进程结束时间 int servicetime; //服务时间 float turnaro

定義的宏超出了9個變量時,用第二個或多個宏更新第一個宏

CLEAR:GT_FIELDCAT,        GS_FIELDCAT.  DATA: LI_POS  TYPE I,        LI_POS2 TYPE I. DEFINE FIELDCAT.    ADD 1 TO LI_POS.    GS_FIELDCAT-EDIT          = &1."允許編輯    GS_FIELDCAT-LZERO         = &2."前導0    GS_FIELDCAT-NO_ZERO       = &

實驗項目wordcount

wordcount 1.设计思路 2.实验代码 GitHub地址: 评论博客地址: 董欣 董雅洁 冯子旋 學習進度和總結 本学期课程即将结束,请总结下你本课程的收获,回顾第0次作业,你是否实现了你的目标? 你对目前的上课和作业方式(上课讲解+PTA+博客)有何意见和建议? 终于我们即将不再是师生.当你结束本课程,你和我就站在同样的位置上,我将不再基于学校授权和知识.经验 (年龄?)上的优势而对你的自由有任何干扰.除发布成绩以外,我最后一次行使教师特权: 请问你有什么要对教师 (我)说的,建议.抱

[转]探索 Windows Azure Storage

本文转自:https://msdn.microsoft.com/zh-tw/jj573842 概觀 儲存服務 (Storage services) 在 Windows Azure 運算模擬器中提供了可永續保存並強固的儲存能力,並且包含了 blob,table 與 queue 等服務.另外,使用 Windows Azure Drives,您執行於雲端的 Windows Azure 應用程式將會使用 NTFS APIs 存取植基於 blob storage 的穩固磁碟機.在本手作實驗中,您將會在本地

初探 C# 8 的 Nullable Reference Types

溫馨提醒:本文提及的 C# 8 新功能雖已通過提案,但不代表將來 C# 8 正式發布時一定會納入.這表示我這篇筆記有可能白寫了,也表示您不必急著瞭解這項新功能的所有細節,可能只要瞄一下底下的「概要」說明就夠了. 概要 C# 8 的 Nullable Reference Types 意味著往後所有的參考型別預設都是不可為 null:對於可為 null 的參考型別變數,寫法跟可為 null 的實質型別一樣,宣告時必須在型別後面加上 "?" 字元.請看以下範例: 1 int? num = n

bq25896 IINDPM 及 無 IINDPM 時的 regsiter

  無 IINDPM status 有 IINDPM status   [bq25890 [email protected]][0x0]=0x5d[0x1]=0x6[0x2]=0x91[0x3]=0x1a[0x4]=0x8[0x5]=0x31[0x6]=0x76[0x7]=0x95[0x8]=0x3[0x9]=0x40[0xa]=0x70[0xb]=0x56[0xc]=0x0[0xd]=0x93[0xe]=0x63[0xf]=0x64[0x10]=0x3e[0x11]=0x98[0x12]=0x

Memory Layout of C Programs

from apue 7.6. Memory Layout of a C Program A typical memory representation of C program consists of following sections. 1. Text segment2. Initialized data segment    2.1 initialized read-only area    2.2 initialized read-write area3. Uninitialized d

java期末考试 8

/**8 * 利用文本框,標籤,按鈕等完成一個界面 * 輸入一個平時成績,一個實驗成績,一個期末成績 * 按照一定的比例自動出現一個綜合成績 **/ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java