二進制炸彈實驗binarybomb 拆彈

##寫在前面
這個實驗是系統級編程的課程實驗,非常有意思,給定一個可執行文件bomb.exe,這個程序打開之後需要用戶輸入一些東西,只有輸入指定的字符串或者數字才能到達下一個步驟,一共有7個步驟,如果輸入錯誤,屏幕會顯示boom!!並退出程序,意味着你引爆了這個炸彈。你需要反彙編這個可執行文件來找到拆彈的線索。老師給我們提供了兩種方法:使用GDB+objdump來反彙編;使用IDA 來反彙編

做本實驗採用的工具是IDA Pro6.6

實驗的材料在這裏:二進制炸彈實驗所需資源下載(GDB+objdump)
IDAPro6.6
如果發現資源需要積分並且你沒有足夠的積分的話,請私信並留下郵箱,我會通過郵箱發給你。
#Phase 1:
打開IDA,反彙編bomb.exe。可以看到如圖

這裏寫圖片描述
這裏寫圖片描述
看到彙編代碼,這裏有一句string 內容是”Public speaking is very easy.”,然後將它放在ESP+4的位置,再將輸入數據放在ESP的位置,調用_strings_not_equal方法,所以我們可以確定要輸入的字符串是Public speaking is very easy. ** Phase 1解決。
這裏寫圖片描述
#Phase 2
打開IDA,選擇phase2 的函數,按
F4**,可以看到反彙編得到的C語言代碼,這代碼是根據彙編函數反彙編得到的,跟原來的代碼有很大差別,不過還是可以從中窺探出一些蹤跡。
這裏寫圖片描述
其中,核心代碼是這段,也就是紅色框框起來的代碼:
這裏寫圖片描述
很明顯v5是一個計數器變量,用來遍歷6個數,從藍色框的結構我們可以猜測這是一個數組,int型的,因此if語句換個說法就是(i+1)a[i-1]!=a[i],所以拆除炸彈所需要的6個數字應該滿足(i+1)a[i-1]!=a[i] ,也就是
2a[0]=a[1]
3a[1]=a[2]
4a[2]=a[3]
5a[3]=a[4]
6a[4]=a[5]
如果第一個數是1,那麼這6個數是:1 2 6 24 120 720
Phase 2 解決。
這裏寫圖片描述
#Phase 3
打開IDA,選中phase 3的函數,按f4,我們可以得到phase 3的代碼
這裏寫圖片描述
可以看到這是一堆switch case代碼
看到這句語句
這裏寫圖片描述
可以得知我們應該輸入兩個整數,一個字符
選中右邊的代碼塊可以對應到左邊的彙編指令,我發現第一個整數對應的內存是[ebp-0x18]
字符對應的內存是[ebp-0x11],第二個整數對應的是[ebp-0x10].
這裏寫圖片描述
對第一個整數進行判斷
這裏寫圖片描述
每個相應的case中都會給v9賦值,我們看彙編指令可以發現v9其實是[ebp-0x9],看到代碼後邊可以發現,是要將[ebp-0x11]也就是字符的值賦給eax54這個變量,然後再取低4位與[ebp-0x11]比較。
這裏寫圖片描述
這裏寫圖片描述
發現除了 2 3 7 之外其他的數都是十六進制的,並且7沒有break,會出現問題,在這裏我選2,那v9的值就是98,通過查ASCII碼錶可以知道98是小寫字母b,那第一第二個參數就出來了,然後第三個參數,v29,如果不等於0xfb就會引爆炸彈,那0xfb是十進制的755,所以我們第三個參數就是755。所以我們應該輸入2 b 755 ** 。Phase 3解決。
這裏寫圖片描述
#Phase 4
打開IDA,選擇phase 4,按f4反彙編成C語言代碼,可以看到如圖
這裏寫圖片描述
通過查看程序可以知道,phase 4的主體代碼很簡單,就是讓用戶輸入一個整數,調用一個func4(),如果返回值不是55就引爆炸彈。
所以我們看一下func4()。
這裏寫圖片描述
這裏寫圖片描述
所以我們一層層推,可知只有當參數是9的時候遞歸的結果是55,所以我們應該輸入
9
,phase 4 解決。
這裏寫圖片描述
#Phase 5
打開IDA 選擇phase 5 按住f4反彙編成c語言 可以看到如下圖
這裏寫圖片描述
通過程序我們可以看到,我們需要輸入6個數
這裏寫圖片描述
這裏寫圖片描述
看到這句關鍵代碼,eax6是一個Int型,而且下面的句子也出現了eax6,這時候光看這份不完整的代碼就不夠了,看一下彙編代碼
這裏寫圖片描述
可以看到,代碼的意思是將數組_array_2464的第[eax]個字節存放到eax裏面,再拼接起來,我們可以看到這個數組是一個字符串數組,在看到後面還有一個數組,將拼接的結果和aGiants數組壓棧之後調用了_strings_not_equal函數,所以我們可以斷定拆這個炸彈的方法就是從_array_2464這個數組中提取“giants”,那位置是15 0 5 11 13 1 。化成十六進制就是0xf 0x0 0x5 0xb 0xd 0x1.
這裏寫圖片描述
但是要注意到它的偏移量不是直接通過輸入數字獲得的。它是通過每個輸入的數取低4位,再與0xf進行與運算,結果是什麼呢,當然就是輸入的數的最後一個字節。
這裏寫圖片描述
我知道內存中存放數值是變成16進制的,00 00 00 00,它取的是第一個00的後一個0的位置,所以我們輸入了之後,我們希望內存是這個樣子:
0f 00 00 00
00 00 00 00
05 00 00 00
0b 00 00 00
0d 00 00 00
01 00 00 00
當然0的位置隨便是什麼都可以,所以我選3f 30 35 3b 3d 31,查找ASCII碼錶可以知道它們分別是**?05;=1** ,Phase 5 解決
這裏寫圖片描述
#Phase 6
打開IDA 選擇phase 6 按住f4反彙編成c語言 可以看到如下圖
這裏寫圖片描述
根據炸彈會爆炸的情況分成3段:
這裏寫圖片描述
第一段的意思是每個數字不能大於6,第二段的意思是這6個組成一個數組的話a[i]不能等於a[i+1],第三段的意思暫時不需要管,後面會說
這裏寫圖片描述
我們看到struct s1應該是一個鏈表,f8指向下一個節點,s0應該是一個節點
從彙編代碼和c代碼中看不出什麼,所以在phase 6的開頭設一個斷點,調試一下看看。
我們輸入1 2 3 4 5 6,很顯然這個輸入是滿足前面兩個條件的,所以我們直接看最後一個條件,這裏我們看到我輸入的6個數,生成了6個節點
這裏寫圖片描述
看到內存相應的位置
紅色框的是我的鏈表,藍色框的是每一個節點,我們可以清楚的看到節點的結構,第一行是一個數值,跟第二行有關,第二行是每個輸入的數字,第三行是下一個節點的地址
這裏寫圖片描述
繼續執行到cmp語句,查看當前比較的兩個參數,eax和edx
這裏寫圖片描述
剛好是第一第二個節點的內存中第一行的值
如果要滿足條件的話,前一個值要大於等於後一個值,由內存中的值可以得到,每個數字對應生成的該值爲
6->01b0
5->00d4
4->03e5
3->012d
2->02d5
1->00fd
所以正確的排序應該是4 2 6 3 1 5
這裏說一下爲什麼要用1到6來試,因爲之前有說過這六個數不能大於6,而且如果他們小於0的話,在彙編代碼中有一個eax-1的操作,0x00000000-1會變成0xFFFFFFFE,這也是不對的。
Phase 6解決
這裏寫圖片描述

至此,炸彈拆除。
#Secret phase:
但是我們可以發現在代碼的字符串集中有這麼一句話:
這裏寫圖片描述

所以這個炸彈有一個secret phase
怎麼進入這個secret phase呢
我在phase 6 的方法的最後設置了一個斷點,發現當拆除phase 6之後會進入一個_phase_defused的函數
這裏寫圖片描述

可以發現進入secret phase的條件有兩個:一個是輸入的字符串數目達到6,也就是拆除所有phase之後,另一個是從一個內存中讀入一個整數和一個字符串,這個字符串要跟austinpower一樣。
我們設置斷點,進行調試,發現當它調用_sscanf函數的時候,它的參數是一個存放在地址00408190的內容
這裏寫圖片描述

我點進去看這個地址,發現這個地址存放的是phase4的輸入值,那裏本來只有一個9
這裏寫圖片描述
但是要進入secret phase呢就要再輸入一個austinpower的字符串。

那我在拆炸彈的時候,在拆phase4的時候多輸入一個austinpower,然後就成功進入了secret phase
我們看到secret phase的代碼
這裏寫圖片描述
這裏有一個func7的函數,我們再來看一下func7
這裏寫圖片描述
它定義了一個結構體,初步看應該是一個樹的結構,再結合下面代碼它訪問的兩個不同成員,可以確定是一棵二叉樹。
那二叉樹的值在哪呢?
這裏寫圖片描述
我們可以看這個ebp-r,r的值是8,所以看到相應的位置
這裏寫圖片描述
裏面的值也是一個地址,雙擊到這個地址去看
這裏寫圖片描述

這正好就是二叉樹的內容。我根據內容把這棵樹畫出來是這樣子:
這裏寫圖片描述
好了,再來看一下func7的代碼
這裏寫圖片描述
調用func7會傳遞兩個參數:二叉樹的根節點和一個整數
如果這個數小於當前節點,就往一個子節點遍歷,並且eax3=eax42+1 如果大於當前節點,就往另一個子節點遍歷,並且eax3=eax52 如果相等則返回0。
而secret phase的拆彈條件是這個函數的返回值要等於7,所以我們逆推一下,只有滿足7=3+3+1,3=1+1+1,1=0+0+1的時候才能說得通,所以我們可以確定這個二叉樹的遍歷順序是一直往這個數小於當前節點的方向遍歷,也就是往右邊子節點遍歷,要使二叉樹往右邊遍歷,那這個整數就只能是1001.
到此,二進制炸彈完美解決。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章