1. 程式人生 > >CSAPP第二個實驗bomblab

CSAPP第二個實驗bomblab

nbsp 如果 累加 一個 爆炸 ron 順序 3.5 節點

文件和完整的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

CSAPP第二個實驗bomblab