1. 程式人生 > >深入理解計算機系統bomb實驗

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

一.實驗目的

通過此次實驗,提高閱讀和理解彙編程式碼的能力,學習使用gdb除錯工具。

二.實驗資源

從實驗課程網站上下載的bomb壓縮包。實驗環境為虛擬機器中的linux系統。

三.實驗要求與準備

<1>本次實驗為熟悉彙編程式及其除錯方法的實驗。 

<2>實驗內容包含2個檔案bomb(可執行檔案)和bomb.c(c原始檔)。 

<3>使用gdb工具反彙編出彙編程式碼,結合c語言檔案找到每個關卡的入口函式。 

<4>分析彙編程式碼,找到在每個phase程式段中,載入程式跳轉到 “explode_bomb”程式段的地方,並分析其成功跳轉的條件,以此為突破口尋找應該在命令列輸入何種字元通關。 

<5>本實驗一共有7個關卡,包括6個普通關卡和1個隱藏關卡。要求至少通過6個普通關卡

1.直接在linux系統中用瀏覽器登入實驗課程網路,下載bomb實驗相關資料夾。可執行檔案bomb,C語言檔案放在桌面。


2. cd+Desktop進入桌面資料夾,對bomb反彙編得到彙編程式碼放在1.txt檔案中。


2. 嘗試執行檔案。發現無法正常執行,顯示沒有許可權,通過查閱相關資料找到了一個解決辦法:


選中bomb->properties->permissions->選擇allow executing file as program


四.實驗任務

Phase 1

1.思路分析與原理設計

<1>前面幾行是開闢棧:

push %ebp                     ebp入棧

mov %esp,%ebp                 esp始終指向棧頂元素,此時ebp為棧頂

Sub $0x18,%esp                開闢一段新的空間

<2>找到跳轉到<explode_bomb>的程式碼段

 

向前找到<explode_bomb>的條件:<string_not_equal>,即兩個字串內容不相同時

要比較的兩個字串分別是:

立即數0x804a15c地址中的內容和0x8(% ebp),即我們要輸入的字串。

2.利用gdb檢視地址0x804a15c的內容,得到通關語句

實驗心得

觀察彙編程式碼,發現呼叫了<string_not_equal>函式,可以推測輸入的是一串字串,通過x/s以字串的形式檢視地址0x804a15c所對應的值,輸入該字串即可通過關卡。字串比較函式是通過將兩個字串進行比較,將結果存到%eax中,最後判斷%eax的值。

phase 2

1.思路分析與原理設計


發現在這段程式碼中,有幾個呼叫函式的地方:

<1>8048d7f   call 804910b<read_six_numbers>

呼叫名為read_six_numbers的函式,讀入輸入的六個數,檢視該函式的彙編程式碼:

0804910b <read_six_numbers>:

push   %ebp :%ebp入棧

mov    %esp,%ebp:使%esp儲存當前棧頂的地址,即指向%ebp

sub    $0x28,%esp:為當前函式開闢一個棧幀

mov    0xc(%ebp),%eax

lea    0x14(%eax),%edx

mov    %edx,0x1c(%esp):儲存第六個數

lea    0x10(%eax),%edx

mov    %edx,0x18(%esp):儲存第五個數

lea    0xc(%eax),%edx

mov    %edx,0x14(%esp):儲存第四個數

lea    0x8(%eax),%edx

mov    %edx,0x10(%esp):儲存第三個數

lea    0x4(%eax),%edx

mov    %edx,0xc(%esp):儲存第二個數

mov    %eax,0x8(%esp):儲存第一個數

movl   $0x804a232,0x4(%esp)

<2>8048d90處呼叫<explode_bomb>

棧的開闢階段

讀入六個數


將第一個數放在了-0x20(%ebp)的位置,並比較第一個數與0的大小,若相等則繼續,否則炸彈爆炸,第二個數在-0x1c(%ebp)的位置,比較第二個數與1的大小,若相等,則繼續,否則炸彈爆炸。所以可以確定要輸入的第一個數是0,第二個數是1.


將地址-0x18(%ebp)->%ebx

將地址-0x8(%ebp)->%esi

mov  -0x4(%ebx),%eax     %ebx儲存相對%ebp偏移量為24(0x18的十進位制數)的地址,該地址-4傳給%eax,即%eax中儲存相對%ebp偏移量為28

add -0x8(%ebx),%eax     將相對ebp偏移量為28和32的記憶體中的數相加,即將第一個數0,第二個數1,相加,得到第三個數1,存入%eax

esi為迴圈結束條件,%ebp中的值加4,即將第二個和第三個數相加,得到第四個數,第三個和第四個數相加,得到第五個,第四個數和第五個數相加,得到第六個數。這段彙編程式碼先確定了前兩個數的值,然後通過迴圈,後面的數等於它前面兩個數之和依次確定這六個數。

2. 得到通關語句

迴圈結束,所以要輸入的六個數分別是:0 1 1 2 3 5

輸入這六個數,通關

2. 實驗心得

先確定第一二個數,這部分比較簡單,然後add -0x8(%ebx),%eax ,將兩個數相加,結果儲存在%eax,%esi控制迴圈,%ebx=%ebx+4,改變參加運算的兩個數的地址。

Phase 3

1.思路分析與原理設計

<1>棧的建立過程

 8048ea1: 55                    push   %ebp

 8048ea2: 89 e5                 mov    %esp,%ebp

 8048ea4: 83 ec 28              sub    $0x28,%esp

<2>

 8048ea7: 8d 45 f0              lea    -0x10(%ebp),%eax

 8048eaa: 89 44 24 0c           mov    %eax,0xc(%esp)

 8048eae: 8d 45 f4              lea    -0xc(%ebp),%eax

 8048eb1: 89 44 24 08           mov    %eax,0x8(%esp)

 8048eb5: c7 44 24 04 3e a2 04 movl   $0x804a23e,0x4(%esp)

 8048ebc: 08

 8048ebd: 8b 45 08              mov    0x8(%ebp),%eax

 8048ec0: 89 04 24              mov    %eax,(%esp)

執行完這些步驟後的棧:

<3>call呼叫函式[email protected]

呼叫函式結束後,可以看到當%eax>1時,跳轉,否則引爆炸彈,推測eax為函式[email protected]的返回值,則需要輸入一個以上的數字。

<4>輸入數字

根據這兩條彙編語句推測,輸入的第一個數字儲存在地址-0xc(%ebp)中,且不大於7.

<5> switch部分

進入switch語句,根據輸入的不同數字,跳轉到不同的地址,具體的地址要使用gdb檢視。

gdb中,用p/x *(int *)(0x804a1a0+4*輸入的數字)檢視對於所有輸入輸入的跳轉地址。

繼續向下進行:發現第一個輸入的數字必須小於等於5,第二個數必須和%eax中的值相等,即根據輸入的第一個數跳轉到不同地址,對%eax中的數進行相關操作,產生一個新值,輸入的第二個數必須和這個數相等。

根據跳轉地址,計算第二個數。

i=0時,跳轉到0x8048f12

8048f1e: 2d 5a 03 00 00        sub    $0x35a,%eax

 8048f23: 05 ef 02 00 00        add    $0x2ef,%eax

 8048f28: 2d 16 02 00 00        sub    $0x216,%eax

 8048f2d: 05 16 02 00 00        add    $0x216,%eax

 8048f32: 2d 16 02 00 00        sub    $0x216,%eax

 8048f37: 05 16 02 00 00        add    $0x216,%eax

 8048f3c: 2d 16 02 00 00        sub    $0x216,%eax

經計算的到第二個數應為147

 8048f41: eb 0a                jmp    8048f4d <phase_3+0xac>//跳轉到地址8048f4d

這句彙編程式碼要求輸入的第一個數字不大於5

i=1時,跳轉到0x8048f19

根據這些語句計算出第一個數為1時,第二個數應為-641

可以看到進行完計算的操作後,都要跳轉到地址8048f4d即第一個輸入數字不能大於5.

2.得到結果

3. 實驗心得

使用了switch分支結構,根據輸如的不同數字跳轉到不同位置進行不同位置進行運算,最後得到結果。首先分析輸入數字的範圍,然後通過不同的輸入判斷跳轉的位置來準確計算。


相關推薦

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

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

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

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

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

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

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

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

深入理解計算機系統BombLab實驗報告

又快有一個月沒寫部落格了,最近在看《深入理解計算機系統》這本書,目前看完了第三章,看完這章,對程式的機器級表示算是有了一個入門,也對 C 語言裡函式棧幀有了一個初步的理解。 為了加深對書本內容的認識,以後每學習完一部分章節,就完成相應書本附帶的實驗題目。 第三章對應的實驗是 BombLab,下面是我做這個

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

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

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

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

深入理解計算機系統(CSAPP)課程實驗bomb程式炸彈實驗日誌(phase_4)

本文接 深入理解計算機系統(CSAPP)課程實驗bomb程式炸彈實驗日誌(phase_3)繼續寫,phase_4部分在昨天已經完成了,日誌在今天才開始寫。個人認為這個部分是整個bomb程式炸彈最難破解的部分,在破解的過程中發現這是一個遞迴函式,體現在組合語言中就顯得特徵不是

深入理解計算機系統(CSAPP)課程實驗bomb程式炸彈實驗日誌(phase_6)

找到phase_6的程式碼,比前面幾關都要長很多: 08048c89 <phase_6>: 8048c89: 55 push %ebp 8048c8a: 89 e5 mov %

深入理解計算機系統(CSAPP)課程實驗bomb程式炸彈實驗日誌(phase_3)

在Notepad++編輯器中找到函式phase_3,程式碼如下: 08048ea1 <phase_3>: 8048ea1: 55 push %ebp 8048ea2: 89 e5

深入理解計算機系統 Linux&GCC工具鏈實驗 筆記

——————————————————————————————————————————這個沒什麼營養價值,只是草稿 1.Linux 發展:multics-unix(Brian Kernighan等人)-Berkeley UNIX(BSD)-Linux釋出Linux 2.

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

是關於位操作的實驗,總體上比較簡單。個人感覺bitcount比較難,我參考了stackoverflow中的一篇帖子,講的挺好。網址是http://stackoverflow.com/questions/3815165/how-to-implement-bitcount-us

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

/* * CS:APP Data Lab * * <Please put your name and userid here> * * bits.c - Source file with your solutions to the Lab.

深入理解計算機系統 perflab 程式效能優化實驗

自從上次實驗3bomb已經過去很久了,昨天週六下午剛剛驗收完所帶班級的必做實驗的最後兩個,最近一直很忙,也沒有來更新了,其實不是最近應該是每天都好忙,最近一直還在看論文做實驗。 驗收前週五拿出時間來看了一下最後兩個必做實驗。一個是perflab,效能實驗,這個實驗主要是考

bomb lab (《深入理解計算機系統》lab2)

bomblab下載頁:http://download.csdn.net/download/u013648407/7279933  其中bomb是可執行檔案  需要用objdump指令反彙編,c1.txt是我反彙編所得到的assembly code。 ************

深入理解計算機系統-作業2.10

oid 位置 pla borde 作業2 nbsp body 開始 width 1 void inplace_swap(int *x, int *y){ 2 *y = *x ^ *y;/*step1*/ 3 *x = *x ^ *y;/*step2*/ 4

深入理解計算機系統 第三章大略和第五章大略

$0 一個 編譯 存儲器 系統 32位 做了 ++i 擴展 這2章總結的很少,主要是覺得沒那麽重要。 1.2個操作數的指令,第二個操作數通常是目的操作數:movb a b,move a to b,而add a b,b+=a,指令分為指令類,如mov類:movb,movw,m

電子書 深入理解計算機系統.pdf

大量 內容 ora 其他 hal 科學 本科生 and acm 內容簡介  和第2版相比,本版內容上*大的變化是,從以IA32和x86-64為基礎轉變為完全以x86-64為基礎。主要更新如下:  基於x86-64,大量地重寫代碼,首次介紹對處理浮點數據的程序的機器級支持。 

深入理解計算機系統》Tiny服務器4——epoll類型IO復用版Tiny

[] 用戶數據 nts tin 服務 監視 結束 col 結構   前幾篇博客分別講了基於多進程、select類型的IO復用、poll類型的IO復用以及多線程版本的Tiny服務器模型,並給出了主要的代碼。至於剩下的epoll類型的IO復用版,本來打算草草帶過,畢竟和其他兩種

深入理解計算機系統之虛擬存儲器

fragment 策略 動態鏈接 字段 索引 ~~ cti 錯誤 個數 http://blog.csdn.net/al_xin/article/details/38590931 進程提供給應用程序的關鍵抽象: 一個獨立的邏輯控制流,它提供一個假象,好像我們的程序獨占地