逆向工程之二進制炸彈第一發

   down了二進制炸彈實驗,名字就很酷是否是。簡要介紹下,二進制炸彈是一個可執行文件,運行時,提示用戶輸入6個不一樣的字符串,若是其中的任何一個不正確,炸彈就會爆炸。初步判斷有六個級別,難度逐級遞增。這個實驗須要學生經過對程序反彙編和逆向工程來判斷是哪6個答案,從而拆除它的炸彈。java

     文檔裏面提示用到了gdb和objdump,那麼問題來了。第一步怎麼作?python

照慣例我神遊了一番,而後打開objdump –help翻看幫助,有個-t 參數,能夠打印程序的符號表,據我所知符號表裏面存儲的是一些函數名和變量名,或許我能夠從這裏尋找一些有規律的符號找出線索。開幹!函數

objdump –t  bomb > 1

 

瀏覽一遍,發現了線索,表裏有phase_1到phase_6這類符號,正好和6個層級有點對應,話說這信息有點亂,咱grep一下工具

很好,結果清晰了,可是這個invalid_phase和secret_phase是作什麼的?不大明白。先無論,3d

objdump – d bomb > 2 

 

反彙編 bomb程序,導入文件2中,找到Phase_1部分指針

Phase_1裏面有調用explode_bomb,那如今肯定了就 是這個。調試

下一步----------->追蹤Phase_1blog

分析下Phase_1部分,邏輯很清楚。調用strings_not_equal,判斷字符串是否相等,若是相等,咋跳轉到leave語句,返回。不等,則調用explode_bomb,程序結束。文檔

   咱跟進去分析一下strings_not_equal代碼:字符串

關鍵部分我加了註釋,strings_not_equal邏輯是這樣:

         調用string_length計算用 戶輸入的字符串長度,而後和密鑰長度對比,若是不等,則直接爆炸,相等,則進一步進行比較。

String_length子部分:

好了,關鍵代碼分析的差很少,咱捋一遍,簡略畫個框圖。

phase_1第一個炸彈邏輯:

String_not_equal子模塊分析:

好了,火燒眉毛拆蛋蛋了。

下一步----------->添加斷點,利用GDB調試工具單步跟進

在strings_not_equal函數入口處添加斷點,其實我想說這裏就能夠得出密鑰了,由於炸彈一的邏輯很簡單,傳遞字符串參數比較嘛,

那麼調用函數以前,確定要將比較值壓入棧,例如這條指令:

0x8048b22:   68 78 96 04 08          push   $0x8049678

 

就很可疑。

咱試試打印出來:

果真有戲。:-D

可是這樣快就拆掉太沒意思了,咱仍是跟進去細細分析下吧~

提個問題?若是想知道密鑰的長度咱該怎麼辦?

分析:我們在string_not_equal函數裏面調用了string_length函數來計算長度,函數的結果利用eax寄存器傳遞出來,那麼很簡單啦,直接在傳遞過密鑰的string_length函數後面加個斷點,而後打印寄存器eax的值就能夠了啊!

我們在string_length函數後面0x8048f49 設定一個斷點,打印,怎麼樣,出來了,密鑰長度35!不信一會你數數:-D

那麼再問一個問題,我想知道用戶輸入的數據是什麼,應該怎麼辦???

上面看懂我分析的代碼的確定知道,傳遞參數無非就是壓棧,利用楨指針加上偏移量就求出來了!很快定位到地址0x8048f38,加斷點,打印esi寄存器值,bingo!!

I have a dream! 酷絢!

 

這裏在告訴你們利用C程序格式化輸出字符串的技巧,這個是調試java虛擬機時候,廖博教給個人。

咱們剛求出了字符串長度爲35,那麼咱們利用GDB把字符串存儲的首地址後35個字符打印出來。

而後寫一個C程序:

OK,就是這個。

話說炸彈尚未拆呢,最後運行bomb程序,輸入密鑰: 「 The futre will be better tomorrow.」

至此,炸彈一拆除完畢。

第二個我還沒分析,回頭繼續直播!

相關文章
相關標籤/搜索