哈工大 計算機系統 實驗三 二進制炸彈


所有實驗文件可見github 計算機系統實驗整理

實驗報告

實 驗(三)

題 目 Binary Bomb
二進制炸彈    
專 業 計算學部
學   號
班   級
學 生
指 導 教 師
實 驗 地 點  
實 驗 日 期

計算機科學與技術學院

目 錄

第1章 實驗基本信息 - 3 -
1.1 實驗目的 - 3 -
1.2 實驗環境與工具 - 3 -
1.2.1 硬件環境 - 3 -
1.2.2 軟件環境 - 3 -
1.2.3 開發工具 - 3 -
1.3 實驗預習 - 3 -
第2章 實驗環境建立 - 5 -
2.1 UBUNTU下CODEBLOCKS反匯編(10分) - 5 -
2.2 UBUNTU下EDB運行環境建立(10分) - 5 -
第3章 各階段炸彈破解與分析 - 6 -
3.1 階段1的破解與分析 - 6 -
3.2 階段2的破解與分析 - 7 -
3.3 階段3的破解與分析 - 8 -
3.4 階段4的破解與分析 - 9 -
3.5 階段5的破解與分析 - 11 -
3.6 階段6的破解與分析 - 12 -
3.7 階段7的破解與分析(隱藏階段) - 14 -
第4章 總結 - 17 -
4.1 請總結本次實驗的收獲 - 17 -
4.2 請給出對本次實驗內容的建議 - 17 -
參考文獻 - 18 -

第1章 實驗基本信息

1.1 實驗目的
熟練掌握計算機系統的ISA指令系統與尋址方式
熟練掌握Linux下調試器的反匯編調試跟蹤分析機器語言的方法
增強對程序機器級表示、匯編語言、調試器和逆向工程等的理解
1.2 實驗環境與工具
1.2.1 硬件環境
X64 CPU;2GHz;2G RAM;512GHD Disk
1.2.2 軟件環境
Windows7 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/優麒麟 64位;
1.2.3 開發工具
GDB/OBJDUMP;EDB;KDD等
1.3 實驗預習
上實驗課前,必須認真預習實驗指導書(PPT或PDF)
了解實驗的目的、實驗環境與軟硬件工具、實驗操作步驟,復習與實驗有關的理論知識。
請寫出C語言下包含字符串比較、循環、分支(含switch)、函數調用、遞歸、指針、結構、鏈表等的例子程序sample.c。
生成執行程序sample.out。
用gcc –S或CodeBlocks或GDB或OBJDUMP等,反匯編,比較。
列出每一部分的C語言對應的匯編語言。
修改編譯選項-O (缺省2)、Og、O0、O1、O2、O3、Og,-m32/m64。再次查看生成的匯編語言與原來的區別。
堆棧訪問[rbp+-n]或[rsp+n]。-fno-omit-frame-pointer。
GDB命令詳解 –tui模式 ^XA切換 layout改變等等
有目的地學習: 看VS的功能GDB命令用什么?

第2章 實驗環境建立

2.1 Ubuntu下CodeBlocks反匯編(10分)
CodeBlocks運行hellolinux.c。反匯編查看printf函數的實現。
要求:C、ASM、內存(顯示hello等內容)、堆棧(call printf前)、寄存器同時在一個窗口。
在這里插入圖片描述

圖2-1 Ubuntu下CodeBlocks反匯編截圖

2.2 Ubuntu下EDB運行環境建立(10分)
用EDB調試hellolinux.c的執行文件,截圖,要求同2.1
在這里插入圖片描述

圖2-2 Ubuntu下EDB截圖

第3章 各階段炸彈破解與分析
每階段15分(密碼10分,分析5分),總分不超過80分

整體破解情況:
在這里插入圖片描述

3.1 階段1的破解與分析
密碼如下:I was trying to give Tina Fey more material.
破解過程:
在這里插入圖片描述

從上圖畫紅線的位置往下,可以看出在給%esi傳了一個值之后調用strings_not_equal函數,之后對寄存器之中的值進行判斷,可以大膽猜測需要比較的炸彈的值就存在0x403150中,使用gdb查看一下該地址中的值:

在這里插入圖片描述

可以發現其中的值是“I was trying to give Tina Fey more material.”則可以判斷這就是這一階段的炸彈值,經過驗證之后確實如此
3.2 階段2的破解與分析
密碼如下:0 1 1 2 3 5
破解過程:階段2的反匯編代碼如下
在這里插入圖片描述

從標號①處可以看出,明顯這一階段需要輸入的是六個數字,進入該函數可以看到六個數字應該是每兩個之間有一個空格的格式輸入的。從標號②處可以看出,比較了輸入的第一個和第二個數字,可以看出第一個數字是0,第二個數字是1。而從標號③處可以看出這是一個循環,需要一共輸入六個數字,這一點也和我們從標號①處看到的相同。最后就是標號④,可以看出標號④進行的操作就是將第n-1與n-2處的數加起來得到第n位的數,也就是一個斐波那契數列,那么容易得到需要輸入的炸彈值就是0 1 1 2 3 5。
3.3 階段3的破解與分析
密碼如下:
0 792 or 2 96(其中兩個密碼,還可能有多種組合)
破解過程:
在這里插入圖片描述

通過匯編代碼可以看出這是一個類似於switch跳轉的跳轉的類型,通過對輸入類型的查看可以知道輸入的應該是兩個整型數字,且根據反匯編代碼,可以發現第一個數字應該是在0到6之間,而我們發現366行有一個指針,經過對指針內容的查看,可以發現存儲的地址是0x4014ac,如下圖。
在這里插入圖片描述

而根據366行的反匯編可以看出這一代碼的目的就是將輸入的數字乘以8之后作為地址的偏置量加到0x4014ac上,跳轉到該步執行。從而如果輸入的第一個數字是0的話,那么第二個數字就應該是792,如果第一個數字是2的話第二個數字就應該是96,其余密碼以此類推可得。
3.4 階段4的破解與分析
密碼如下:24 2
破解過程:
根據對第四階段反匯編代碼的分析可以很輕易得出這一階段的代碼實現的是一個遞歸函數,遞歸函數如下:
在這里插入圖片描述

可以發現在408行與412行都對函數進行了遞歸調用。而通過對主函數的分析可以發現,輸入的還是兩個整數(兩個整數后輸入一個特定字符串可以進入隱藏關卡,這一點最后說),而第二個整數必須是2,相關代碼如下,
在這里插入圖片描述

確定了這一點之后就可以通過對遞歸函數的分析來得到輸入的第一個數字是多少。由於這個遞歸函數的遞歸關系較為復雜,因此直接使用了一個c語言程序來實現這一功能,c語言程序中的遞歸函數如下,
在這里插入圖片描述
在這里插入圖片描述

運行此函數可以發現輸入的第一個數字應該是24。這一問需要注意的一點是和上面幾個階段不同,這一階段是根據輸入的第二個數字來確定第一個數字是多少,這是需要注意的。
3.5 階段5的破解與分析
密碼如下:ioa`eg
破解過程:
根據對於源碼的分析,可以發現這是一個對於指針的考察,而我們發現有兩個比較可疑的地址0x4031f0,0x4031a6,通過gdb查看,可以發現這是如下的字符串:
在這里插入圖片描述
在這里插入圖片描述

可以猜測我們需要用到的是maduiersnfotvbyl,根據后面的句子,顯然這兩個字符串不是最終的答案,最后的結果應該是根據這兩個字符串進行一定的處理之后的一個結果,現在只是完成了第一步。

通過對上面這一部分代碼的分析可以發現這是一個循環,則可以分析出輸入的應該是一個6個字符組成的字符串,而通過對圖中圈起的代碼可以發現,這是對於讀入的一個字符的處理,目的是得到該字符的ascii碼低四位,通過對代碼的分析我們可以清楚地發現,我們要以輸入的六個字符的ASCII碼的低四位作為字符串“maduiersnfotvbyl”的索引去除對應的六個字符,使這六個字符按順序組成的新的字符串和"flames"相同。
我們發現flames中的字符在maduiersnfotvbyl中的順序為9,15,1,0,5,7那么我們需要輸入的字符就是ascii碼低四位分別為9,15,1,0,5,7的字符,通過查找ascii碼表我們可以查找到一個符合條件的字符串:ioa`eg
3.6 階段6的破解與分析
密碼如下:1 5 3 2 4 6
破解過程:
通過對第六階段的反匯編代碼的分析可以發現這一階段需要輸入的是六個整型數。由於這一階段的反匯編代碼很長,因此很難一步到位把握住這一階段需要進行的任務是什么,那么可以先尋找是否有如上幾問一樣的地址存儲的信息,可以先通過這一信息分析出一部分題解。可以發現有一個可疑的地址:0x4052d0,通過gdb查看這個地址中的信息,可以發現這是一個如下鏈表:
在這里插入圖片描述

那么我們就可以大膽猜測這是對於這個鏈表進行的操作,那么我們再回頭看上面的代碼,可以發現一個如下的循環,根據這個循環我們就可以大致得出這一段代碼完成的任務是什么了。
在這里插入圖片描述

我們可以發現,這一段代碼的對鏈表中的值進行了比較,最后達到炸彈不爆炸的要求應該是經過處理后的鏈表中存儲的值應該是從小到大的,那么就可以大致猜測出這一段代碼是對鏈表進行了重排之后希望使得鏈表中的值是從小到大排列的,那么如果真的是這樣的話,我們可以得到一個數字列表:1 5 3 2 4 6,經過測試,確實是這樣的。這一段代碼實現的就是根據輸入的數字與鏈表的節點的標號比較對鏈表進行重排后這一鏈表內存儲的值應該是從小到大的。
3.7 階段7的破解與分析(隱藏階段)
密碼如下:35
破解過程:
通過對第六階段下面的代碼進行分析,可以發現這個炸彈應該是存在第七階段的,而第七階段的入口應該是在前面的某一關中的,首先我們找到phase_defused函數,這一函數進行的就是判斷是否進入隱藏階段,對於這一函數中出現的每一個地址查看內容,我們可以發現三個有效的地址內容,如下:
在這里插入圖片描述

24與2就是我們在第四問的時候輸入的內容,而上面一個地址表明進入隱藏階段的入口處輸入的應該是兩個整型數與一個字符串,那么可以大膽猜測就是在第四階段的時候多輸入一個字符串就可以進入隱藏階段,而字符串信息如下:
在這里插入圖片描述

經過求證,確實進入了隱藏階段,那么接下來我們就對隱藏階段的代碼進行分析。可以發現這個同樣是一個遞歸的函數,根據如下反匯編我們得知我們應該輸入一個1~1001之間的數,
在這里插入圖片描述

而根據如下代碼我們又得出fun7的返回值必須為6,

那么我們就可以對fun7進行一個分析,很顯然這是一個遞歸函數,而fun7的代碼大致可以用如下c語言代碼模擬:
在這里插入圖片描述

經過分析我們可以發現返回值應該為6 = ((0 * 2 + 1) * 2 + 1) * 2,共4次遞歸,那么我們就可以直接使用gdb查看對應地址中的數值即可,具體過程如下:
第一次時%rsi的值<36,並讀取0x4050f8的中存的地址值供遞歸調用:
在這里插入圖片描述

第二次時%rsi的值>8,並讀取0x405120中存的地址值供遞歸調用:
在這里插入圖片描述

第三次時%rsi的值>22,並讀取0x405160中存的地址值供遞歸調用:
在這里插入圖片描述

最后讀取0x405230中的內容,這時這里的內容就應該是我們要輸入的答案了。
在這里插入圖片描述

第4章 總結
4.1 請總結本次實驗的收獲
本次實驗主要使我加深了對反匯編代碼的理解,同時對於在gdb中的調試有了更加深入的了解。

4.2 請給出對本次實驗內容的建議
可以增加更多具有趣味性的階段。

注:本章為酌情加分項。

參考文獻

為完成本次實驗你翻閱的書籍與網站等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM