實驗目錄:
- 一、實驗目的
- 二、實驗要求
- 三、實驗內容(所修改函式代碼,功能以及重要代碼的解釋)
- 第一階段:
- 第二階段:
- 第三階段:
- 第四階段:
- 第五階段:
- 第六階段:
- 隱藏階段:
- 四、實驗結果(在虛擬機中,進行炸彈拆除的截圖)
- 五、實驗總結
一、實驗目的
- 熟悉linux基本操作命令,其中常用工具和程式開發環境
- 熟悉反匯編obnjump、除錯指令gdb的操作
- 熟悉匯編語言中的回圈、選擇陳述句,及指標、鏈表、陣列、二分樹的應用
二、實驗要求
- 盡快熟悉linux基本操作命令,還有其中常用工具和程式開發環境,以及objdump、gdb指令
- 靈活掌握各種匯編陳述句,以及查詢記憶體中的資訊的方法,
- 每個炸彈考察了匯編語言的一個不同方面:階段一,字串比較;階段二,回圈;階段三,條件/分支;階段四,遞回呼叫和堆疊;階段五,指標;階段六,鏈表/指標/結構,隱藏階段只有當在階段4的拆解字串后再附加一特定字串后才會出現(作為最后一個階段),
三、實驗內容(所修改函式代碼,功能以及重要代碼的解釋)
第一階段:
密碼:I turned the moon into something I call a Death Star.
分析:

根據strings_not_equal函式可以看出,該函式為判斷字串是否相等的函式,如果輸入的字串和%eax里面的字符不相同,則該炸彈爆炸,所以我們通過x/s $eax查看其中的資料,即可得到該階段的密碼,
第二階段:
密碼:0 1 1 2 3 5
分析:
通過分析read_six_numbers函式可得,該階段的密碼為6個數字,


通過分析這幾句話可知,我們將%ebp-0x30的地址賦值給%esi,通過查看該值為0,(該值即為第一個數字)
通過分析這兩句話得到,該階段的第二個數字為1,

又根據該回圈可知,該值的運算公式為Ni=Ni-1+Ni-2,
所以,經過簡單的運算得到該階段的密碼為:0 1 1 2 3 5
第三階段:
密碼:2 560
分析:

通過查看%eax里面的值,可以看出該階段的密碼為兩個int型別的資料,又因為cmpl $0x7,-0xc(%ebp)可知第一個資料小于7,所以這里我們可以輸入小于7一個數,我在這里輸入2,然后通過對函式的可以看出,該函式繼續向下執行,當函式執行結束時,我們在通過i r查看%eax的值,此時的值即為第二個資料,由下圖我們可以看出,此時%eax的值560,

所以我們可以得出該階段的密碼為:2 560
第四階段:
密碼:5 15 DrEvil(此階段的密碼實際為:5 15,后面加上的DrEvil字串是為了打開隱藏階段)
分析:

在呼叫函式func4之前,我們先查看%eax里面的值,同樣可以看出,該階段的密碼仍為兩個int型別的資料,
通過這幾句函式可以看出,該階段密碼的第二個數字為:0xf,即15,
此時,我們回傳fun4函式,查看該函式的執行程序,
經過分析我們可以看出該函式為一個遞回函式,此遞回函式的執行結果為:
當輸入第一個字符為0時:%eax = 11,當輸入第一個字符為1時:%eax = 11,
當輸入第一個字符為2時:%eax = 13,當輸入第一個字符為3時:%eax = 10,
當輸入第一個字符為4時:%eax = 19,當輸入第一個字符為5時:%eax = 15…
通過觀察我們可以得出第一個字符應該為5,綜上,該階段的密碼為:5 15
第五階段:
密碼:444422
分析:

分析通過string_length函式,以及cmp $0x6,%eax陳述句我們可以得知該階段的密碼為六個字符,
之后我們觀察到movzbl (%eax),%edx及and $0xf,%edx可知,我們是把輸入字符0拓展為32位賦值給%edx再取%edx的后四位,

然后,我們將%eax進行累加并通過cmp %esi,%eax指令將陳述句進行回圈,
另外,我們觀察add -0x1c60(%ebx,%edx,4), %ecx,這條陳述句,可以得出我們是將-0x1c60(%ebx,%edx,4)的地址對應的值賦給%ecx,于是我們通過gdb除錯出當%edx分別為0,1,2,3,4,時,-0x1c60(%ebx,%edx,4)地址對應的值:

又根據cmp $0x3c,%ecx可以得出我們輸出的%ecx的值為0x3c,即十進制的60,所以通過累加可以計算出60=12+12+12+12+6+6,因此我們可以逆推出該階段密碼為:444422
第六階段:
密碼:1 3 4 6 5 2
分析:

通過這一段代碼可知,該階段密碼為六個不大于六的數字,
又通過該回圈可以看出,我們輸入的六個數分別被7減掉,然后保存在原位置,之后,我們將這些數的地址分別存入不同的地址,存值方式為不斷將%edx+0x8,
由此可知,該鏈表由大到小排列,
根據上述值得到,鏈表值由大到小排列為:0x352、0x324、0x172、0x166、0x109、0x0bd,
對應的值為:6 4 3 1 2 5
又因為對應的密碼是7減去輸入數后的值,
故該階段的密碼應為:1 3 4 6 5 2
隱藏階段:
密碼:1001
分析:

根據phase_defused可知,在做完前六個題才可以打開隱藏關卡,且需要在第四個階段的密碼后加入特定的字串,

通過我們查看得知,該字串為DrEvil



首先分析secret_phase,由read_line可知,輸入的是一個字串,并且strtol函式是將一個字串轉化為十進制長整數賦給%esi作為回傳值,呼叫func7之前,%eax被賦值為36,即第一個引數a1=0x24,a2為要輸入的數,再由func7之后,可以知道回傳值是0x7,
通過觀察func7內的陳述句可知,該函式的核心部分是遞回,且該遞回函式的方式為:

由此可知,最深層的%eax=0,并且如果*a1=a2,則推出最里面的遞回條件, 因為 func7 執行完后回傳值是 7,而逆推出 7 的產生程序為:


運算完畢后查看結果得知該結果為0x3e9即1001,
所以該階段的密碼為1001
四、實驗結果(在虛擬機中,進行炸彈拆除的截圖)

五、實驗總結
完結撒花
``
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240528.html
標籤:其他
上一篇:資料恢復基礎和進階教程(一)
下一篇:《408計算機網路》綜合應用題
