1. 程式人生 > >計算機系統原理實驗之BombLab二進位制炸彈5、6關

計算機系統原理實驗之BombLab二進位制炸彈5、6關

實驗目的:

通過二進位制炸彈實驗,熟悉組合語言,反彙編工具objdump以及gdb除錯工具。

實驗內容:

1、炸彈實驗第5關。

2、炸彈實驗第6關。

實驗過程:

第五關:

1、根據前幾關的經驗,進入bomb檔案的gdb除錯命令下,直接檢視第五關的彙編程式碼。

 

2、直接回車可以顯示餘下的phase_5函式的程式碼,瀏覽完一遍phase_5函式的彙編程式碼後,並不能直接發現此程式碼的精髓所在,因此,我開始逐條分析phase_5函式的程式碼。

首先是棧幀準備,開闢32位元組的空間:

 

接著載入%ebp-0x10處的有效地址間接儲存到%esp+0xc處,也就是引數2存放的地方,同理,載入%ebp-0xc處的有效地址間接儲存到%esp+0x8

處,也就是引數1存放的地方。

 

接著看見了一串似曾相似的程式碼,老規矩,檢視此地址處存放的資料,發現我們仍是輸入兩個整數。

 

接著把%ebp+0x8處儲存的值傳送給%esp,然後呼叫[email protected]函式。

 

3、往下接著看,比較了%eax1的大小,若%eax大於1,則跳轉到<phase_5+51>處,否則,呼叫爆炸函式,引起爆炸,由此處可得,輸入的引數個數必須大於1個。

 

4、接著把引數1傳給%eax,並對%eax0xf作按位與運算,也就是取出引數1的低四位。

5、接著把取出來的引數1的低四位與0xf作比較,若相等,則跳轉到爆炸函式,否則,執行下一步,由此可見,引數1

的低四位不為1111

 

6、接下來對%ecx%edx賦值,初始化為0%ebx則儲存地址0x804a1c0

 

7、接下來,執行%edx1操作,而後執行操作得到eax=*(ebx+4eax),由於之前得到%ebx儲存地址0x804a1c0,並且此處以4*eax為步長,猜測0x804a1c0是一個數組的首地址,接著把儲存在地址*(ebx+4eax)處的值與%ecx相加儲存在%ecx中。

 

8、接著把%eax儲存的值(應該是陣列的序號)與0xf也就是15作比較,若不等於,則跳到<phase_5+80>處,否則,接著執行後續程式碼,由此可知,<phase_5+80>處開始應該是一個迴圈,每次迴圈取出陣列中的一個值累加儲存到

%ecx中,最後一次取出的值應該是15,接著把%edx15作比較,不相等則爆炸,反之,執行後續程式碼,由此可見迴圈需要進行15次,加上輸入引數1(取值的時候只取了引數1二進位制的後四位)的時候進行了一次迴圈,所以,總共取了16次陣列的值。

 

9、分析到這裡,大概可以理清了,輸入引數1,呼叫迴圈,而後每次從陣列中取出一個數累加到%ecx中,且16次迴圈的過程中直到最後一個才能取到15,由此,我們打印出陣列連續的16位。

 

另外我試著多列印幾位看看數組裡儲存的到底是什麼:

 

發現,其實這個數組裡儲存的剛好就只有16個有效元素,由此,推匯出下面這個表。

陣列序號和陣列值相對應的表:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

10

2

14

7

8

12

15

11

0

4

1

13

3

9

6

5

然後,根據上述推斷則可以逆推出在數組裡取到的值包括引數1在內的序列為:

5

12

3

7

11

13

9

4

8

0

10

1

2

14

6

15

又因為引數2為在數組裡取到的值的累加值,所以引數2為:

12+3+7+11+13+9+4+8+0+10+1+2+14+6+15=115

也可以通過檢視暫存器的值來得到引數2,通過以上分析,可以知道引數2被儲存在%ecx中,在下圖中可以看到%ecx中儲存的值為115,和我求出來的一致,同時,也可以看到%eax%edx儲存的值都為15,與上述分析的也一致:

 

接下來測試一下5 115是不是正確的通關密碼:

 

到這裡,我不由得想起上次課程老師講過的一點,在呼叫函式的之後,%eax1作比較,得出的結論是,輸入引數的個數必須大於1,那我是不是不用侷限於兩個,測試一下,隨便輸入第三個引數,看看會怎樣,很驚訝,加了第三個引數,我隨便輸入了32,並沒有影響通關密碼的正確性,那麼,就可以猜測,第五關的密碼,只要前兩個正確,後面應該隨便組合都行吧,有無數種可能,這裡,我就不一一去檢驗了:

 

緊接著,我想到了另外一點,前面有讓%eax的低四位和1111作比較,得出的結論是引數1的二進位制低四位不能為1111,而我求出來的答案是5,5的二進位制表示為0101,於是,我有個大膽的猜想,是不是,只要輸入的引數1的二進位制形式的低四位不為1111,或者說剛好為0101的組合都符合通關密碼的條件呢,我檢驗一下10101也就是21看看對不對,驚喜又出現了,真的可以,所以,答案應該是無數種,這裡同樣不一一檢驗了:

 

附上phase_5函式的棧幀圖:

 

第五關成功通過。

第六關:

1、老規矩,檢視phase_6的彙編程式碼。

 

2、在粗略瀏覽完全部程式碼後,真的是不知所云,但還是看見了那麼兩個熟悉的函式名read_six_numbersexplode_bomb函式,由此,只能慢慢開始分析彙編程式碼,老實說,在畫完棧幀圖,一條一條過完全部指令後,我發現,單條指令是什麼我知道,但綜合所有的彙編程式碼,我真的是懵的,所以,我接著又重新再分析程式碼,仔細咀嚼。

首先是一些堆疊準備以及記憶體空間的開闢,這裡申請了92位元組的記憶體空間:

 

下圖是phase_6函式的棧幀圖:

 

3、接著載入了%ebp-0x30儲存的有效地址到%esp+0x4處,然後呼叫了read_six_numbers函式,檢視此函式的彙編程式碼,結合前面第二關的經驗,可以得到此函式是通過呼叫[email protected]函式來讀取六個整數的:

 

4、在呼叫read_six_numbers函式讀取完六個整數後,執行了如下操作,分析得到讀取的六個整數儲存在棧幀中的位置如下圖所示,所以,當對%ebp-0x30處的資料進行操作時,即可知道是在對引數1進行操作,下圖紅色框內的語句可以得到引數1要小於等於6,通過藍框和紅框內的語句可以得到第二個數和第一個數不相同,結合這一部分的整體程式碼,可以推出讀取到的六個數之間不相等且都小於等於6

 



5、接著檢視後續程式碼,分析以後可以得到,此段程式碼主要實現把一個單鏈表的節點資訊根據輸入引數的值提取出來儲存在%ebp-0x48%epb-0x34的地址處,也就是按照一定的順序這裡是降序(下圖中藍線部分,對新的連結串列的第一個節點的值和第二個結點的值作了比較,得出第一個節點的值大於等於第二個節點的值)把連結串列各個節點的地址儲存在棧幀中:

得出降序排列的語句:

 

 

推導過程圖:

 

執行完這部分程式碼的部分棧幀圖,當然,下圖中的節點1或者節點6指的是根據輸入引數選取出的節點,所以這裡的節點1指的就是連結串列中儲存最大值的那個節點,其它同理:

 

6、接下來的彙編程式碼則是根據上一步得到的降序排序得到的節點地址資訊把連結串列恢復的這麼一個過程:

 

7、所以,只要能得到以地址0x804c0c4為首地址儲存的這個連結串列儲存的資料得出即可以推出輸入的六個引數:

 

8、得到六個結點分別儲存的值為:

1

2

3

4

5

6

0x1a7

0x06c

0x155

0x187

0x3bd

0x255

降序排列後得:

5

6

1

4

3

2

0x3bd

0x255

0x1a7

0x187

0x155

0x06c

9、根據前面的推導過程可以得出輸入的六個引數為561432,檢驗正確性:

 

第六關成功通過。

總結:

通過本次實驗真的真的讓我讀彙編程式碼的能力提升了很多很多,雖然讀彙編程式碼整體性的把控不是很好,但較以前真的大大提升了,也掌握了利用gdb除錯的一些基本方法,頗有收穫。

相關推薦

計算機系統原理實驗BombLab二進位制炸彈56

實驗目的:通過二進位制炸彈實驗,熟悉組合語言,反彙編工具objdump以及gdb除錯工具。實驗內容:1、炸彈實驗第5關。2、炸彈實驗第6關。實驗過程:第五關:1、根據前幾關的經驗,進入bomb檔案的gdb除錯命令下,直接檢視第五關的彙編程式碼。 2、直接回車可以顯示餘下的ph

計算機組成原理實驗運算器組成實驗

一、實驗目的: 1、熟悉邏輯測試筆的使用方法; 2、熟悉LK-TEC-9模型計算機的節拍脈衝T1、T3、T3; 3、熟悉雙埠通用暫存器組的讀寫操作; 4、熟悉運算器的資料傳送通路; 5、驗證74LS181的加、減、與、或功能; 6、按給定的資料,完成幾種指定的

計算機組成原理實驗 雙埠儲存實驗(LK-TEC-9)

一、實驗目的: 1、瞭解雙埠靜態儲存器IDT7132的工作特性及其使用方法; 2、瞭解半導體儲存器怎樣儲存和讀取資料; 3、瞭解雙埠儲存器怎樣並行讀寫; 4、熟悉LK-TEC-9模型計算機儲存器部分的資料通路; 5、掌握資料通路中各個控制訊號的作用和用法; 6

計算機系統原理 Bomb實驗 炸彈一/phase_1

Bomb 日誌l 實驗準備:開啟bomb.c檔案,發現檔案中只有主函式,沒有我們需要闖關的具體程式碼,所以考慮如何通過bomb檔案得到六關的具體程式碼,在linux中通過反彙編得到bomb的彙編程式碼,從第一關開始閱讀彙編程式碼,找出闖關的關鍵程式碼。l 具體過程:開啟下載的

計算機組成原理筆記浮點數運算

http 計算機組成 nbsp 技術 -1 .com alt bsp 筆記 計算機組成原理筆記之浮點數運算

深入理解計算機系統配套實驗(一) data lab 函式詳解

/* 135. * bitAnd - x&y using only ~ and | 136. * Example: bitAnd(6, 5) = 4 137. * Legal ops: ~ | 138. * Max ops: 8 139. *

計算機組成原理實驗2---單週期CPU

實驗目的 實驗內容 設計一個單週期CPU,該CPU至少能實現以下指令功能操作。 必須寫一段測試用的彙編程式,而且必須包含所要求的所有指令,slti指令必須檢查兩種情況:“小於”和“大於等於”;beq、bne:“不等”和“等”。這段彙編程式必須儘量優化且出現在實驗報告中,同時,給出每條指令

深入理解計算機系統bomb實驗

一.實驗目的通過此次實驗,提高閱讀和理解彙編程式碼的能力,學習使用gdb除錯工具。二.實驗資源從實驗課程網站上下載的bomb壓縮包。實驗環境為虛擬機器中的linux系統。三.實驗要求與準備<1>本次實驗為熟悉彙編程式及其除錯方法的實驗。 <2>實驗內容

計算機組成原理實驗二:RAM實驗

一、實驗專案名稱:RAM實驗 二、實驗目的: 瞭解半導體靜態隨機讀寫儲存器RAM的工作原理及其使用方法。 掌握半導體儲存器的字、位擴充套件技術。 三、實驗內容 ◆採用1K x 4 的晶片,構成1K x 8的儲存器。 ◆選擇五個不連續的存貯單元地址,分別存入不同內容

編譯原理實驗詞法分析

內容有更新哦~~~ 能識別小數,科學記數法表示的數,負數亦可。 不多解釋,程式碼先上: #include <cstdio> #include <iostream> #include <string> #include <cstr

計算機組成原理-實驗三-多功能ALU設計實驗

實驗要求:        本實驗要求設計一個具有8種運算功能的32位ALU,並能夠產生運算結果的表示:結果為零標誌ZF(Zero Flag)、進借位標誌位CF()溢位標誌OF(Overflow Flag)、符號位標誌SF(Sign Flag)和奇偶標誌PF(Parity Fl

計算機組成原理實驗

上機實驗04   邏輯運算程式設計實驗1.瞭解組合語言的邏輯運算指令; 2.熟悉組合語言中邏輯運算指令的使用方法; 3.掌握利用匯編語言邏輯運算指令實現程式設計的方法。二、軟硬體環境 1.硬體環境:微機CPU 486以上,500MB以上硬碟,32M以上記憶體; 2.軟體環境:

CSAPP 深入理解計算機系統課程實驗 bomb實驗 反向編譯 彙編(4)

隱藏關卡。Secretphase 這個隱藏關卡還是很難發現的,自己帶的班上的學生中,僅有3個學生髮現並解除了炸彈。中間也出現了一些小小問題,在給他們驗收的時候也有意識的去引導他們發現一些小問題,並討論解決。 首先是隱藏關卡的發現,其實在彙編程式碼中就有一個secret_ph

CSAPP 深入理解計算機系統 Buflab實驗,緩衝區溢位攻擊實驗(1)

由於實驗太長所以還是採用分開 其實感覺之前做過那個bomb實驗以後,這個實驗相對來說還是很容易的,主要是要搞懂緩衝區溢位原理,以及堆疊的過程,函式呼叫的實現過程,做完這個實驗如果認認真真的做完,對於堆疊的過程,還有快取溢位攻擊的原理就會掌握的比較清楚的。個人感覺實驗設計的

計算機組成原理實驗:乘法實現

1、實驗目的:開放性實驗,根據原理圖實現乘法的電路設計並執行。2、實驗原理:原理一:如圖3-1是實現原碼一位乘運算的基本硬體配置框圖,根據該圖用移位相加方法實現乘法,自行選擇器件設計電路並執行。圖3-1

編譯原理實驗源程式的預處理及詞法分析程式設計

題目要求: 1、實現預處理功能 源程式中可能包含有對程式執行無意義的符號,要求將其剔除。 首先編制一個源程式的輸入過程,從鍵盤、檔案或文字框輸入若干行語句,依次存入輸入緩衝區(字元型資料);然後編制一個預處理子程式,去掉輸入串中的回車符、換行符和跳格符等編輯性文字;把多個

《深入理解計算機系統實驗二 —— Bomb Lab

> 這是CSAPP的第二個實驗,主要讓我們理解程式碼的機器級表示,最重要的是理解每個暫存器的作用以及如何使用這些暫存器。本次的實驗內容有點晦澀難懂,對於這些內容多看下習慣就好了。 >   本次實驗中的bomb檔案中共有7個炸彈問題(6個顯式的和1個隱藏的),每條問題只有輸入正確的答案才能進

《深入理解計算機系統實驗三 —— Buf Lab

> 這是CSAPP的第三個實驗,主要讓我們熟悉GDB的使用,理解程式棧幀的結構和緩衝區溢位的原理。 ## 實驗目的   本實驗的目的在於加深對IA-32函式呼叫規則和棧結構的具體理解。實驗的主要內容是對一個可執行程式“bufbomb”實施一系列緩衝區溢位攻擊(buffer overfl

深入理解計算機系統 第二章資訊的表示和儲存

引言: 這一章我們研究在計算機上如何表示資料和其他型別資料的基本屬性,以及計算機對這些資料執行操作的屬性。在整數運算中,重點描述無符號數和數的補碼所表示的特性;而對於IEEE標準的浮點型資料,一是它是如何表示資料的,二是浮點運算的數學形式。 三種常見的資料型別:整數分為無符號數和有符號數。無

Android View原理解析基礎知識(MeasureSpecDecorViewViewRootImpl)

提示:本文的原始碼均取自Android 7.0(API 24) 前言 自定義View是Android進階路線上必須攻克的難題,而在這之前就應該先對View的工作原理有一個系統的理解。本系列將分為4篇部落格進行講解,本文將主要對MeasureSpec、DecorV