實驗技能
拆彈準備:
?熟練使用gdb除錯器和objdump;
?單步跟蹤除錯每一階段的機器代碼;
?理解匯編語言代碼的行為或作用;
?“推斷”拆除炸彈所需的目標字串,
?在各階段的開始代碼前和引爆炸彈函式前設定斷點,便于除錯,
實驗語言:
C語言,AT&T匯編語言
實驗環境:
32位 linux
實驗介紹:
逆向工程拆除“二進制炸彈”程式
增強對程式機器級表示、匯編語言、除錯器和逆向工程等理解,
一個“Binary Bombs”(二進制炸彈,簡稱炸彈)是一個Linux可執行C程式,包含phase1~phase6共6個階段,
炸彈運行各階段要求輸入一個字串,若輸入符合程式預期,該階段炸彈被“拆除”,否則“爆炸” ,
你需要拆除盡可能多的炸彈,
每個炸彈階段考察機器級語言程式不同方面,難度遞增
階段1:字串比較
階段2:回圈
階段3:條件/分支:含switch陳述句
階段4:遞回呼叫和堆疊
階段5:指標
階段6:鏈表/指標/結構
隱藏階段,第4階段之后附加特定字串后出現
預備
反匯編:
objdump -d bomb > +檔案名
生成一個反匯編的txt檔案
phase_1

我們可以看到<+18>這行,-0x1ebc(%ebx),%eax,而且在后面的eax壓堆疊,0x8($ebp)也壓堆疊,然后call函式進行字串比較,則此時我們可以列印-0x1ebc(%ebx)或%eax查看

所以答案就是“Wow! Brazil is big.”
phase_2

在<+27>可以看到要讀取6個數字
在<+35>得知我們輸入的第一個數和0比較且等于0,
<+41>可知第二個數要和1比較且等于1
<+52><+55>得知第1個數賦值給了esi,第5個數賦值給了edi,
之后到了<+72>以此向下讀取一個數給eax,并與esi相加賦值給eax,在與下一個數比較,相等就跳轉到<+65>,esi到了第2個,與第5個比較,判斷是否退出回圈,
由此可知第3個數等于它前面兩個數之和,
所以答案得到0 1 1 2 3 5
phase_3

<+36>可以看出我們需要輸入

則我們要輸入兩個數
<+47>和<+49>可以得知第一個數在1到7之間,
我們可以輸入2

這一步中通過使用i r可以看出,我們的第二個數為159

所以得到結果為2,159
phase_4

同理,在<+36>可以看到我們需要輸入

列印eax可知我們要輸入兩個數
<+49>可知我們的第一個數應該小于等于14
然后<+70>行,呼叫了fun4,其中我們的第一個數帶入其中計算,然后計算出來的值在<+78>可知,應該等于7
對應結果如下

所以我們選擇14作為我們的第一個數
<+83>則可以看出我們的第2個數為7
所以結果為14,7
phase_5

同理,通過代碼看出也是輸入
列印eax得知需要兩個數

而且第一個數應該不等于15

這是一個小回圈,回圈一次,edx就加1,edx的初始值是0,則我們需要回圈15次
可以得到如下的值

我們第一個5可以滿足這個回圈的要求,
<+105>中,我們的第二個數和ecx比較,且要相等
則列印出ecx的值

所以得到第2個值為115
答案為5,115
phase_6

觀察看到<+27>要我們輸入六個數字,而且

加上這幾行可以得知輸入的數減1不得大于5

則我們的初始值可以輸入1,2,3,4,5,6
從這可以看出我們的數被7減

根據對應的鏈表由大到小排序為0x388,0x324,xc7,0xa9,0x7c,0x36
可以排序6,1,3,2,4,5
因為這些數被7減,所以結果為1,6,4,5,3,2
隱藏階段:
在phase_defused中的第四階段有個隱藏的字串

通過查找得到隱藏字串

然后把“DrEvil”放到第四個答案后面即可進入我們的隱藏炸彈

進入secret_phase

從這可以得知我們輸入的數經過fun7后要等于2
通過觀察func7內的陳述句可知,該函式的核心部分是遞回,且該遞回函式的方式為

由此格式可知我們要用第一個得到偶數2
根據計算得應為22

實驗結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/242873.html
標籤:其他
上一篇:計算機網路課后題
下一篇:2020個人年度總結
