深入理解計算機系統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 進程提供給應用程序的關鍵抽象: 一個獨立的邏輯控制流,它提供一個假象,好像我們的程序獨占地