張渣渣_的學習記錄(1)之二進制炸彈的拆除
二進制炸彈闖關
我們學校計算機系統基礎課程的大作業,現在我把自己做實驗的整個程序貼在下面,希望大家對不足的地方加以指正,
(因為自己在學習的程序中還是有很多的不足,所以在之后的博客中,我會有一篇專門對這篇文章中不足的地方進行補充,
話不多說,我們直接開始!!!!!!
【大作業要求】
該大作業為闖關實驗,共需破解7關,下載壓縮檔案,在Debian系統里進行解壓縮,通過對可執行檔案bomb反匯編,分析匯編代碼并獲取相關線索,從而破解每一關的輸入內容,完成闖關,
【闖關結果】
1、闖關情況

2、破解運行結果
圖1 破解運行結果
【代碼分析】
對成功破解階段的代碼給出分析說明,
階段0
phase_0
圖2 phase_0源代碼及分析
使用objdump生成bomb程式的匯編代碼,下圖將匯編代碼定位在給出了第一關字串對比的地方<phase_0>,可以看出在呼叫<string_not_equal>函式前,現將要參與對比的兩個字串壓入堆疊中,push $0x804a1d7就是存放內置字串的首地址,pushl 0x8(%ebp)是用戶輸入字串的首地址,
圖3 phase_0 gdb除錯
gdb進行除錯,斷點設定在b 72,這時根據匯編陳述句中發現的內置字串首地址0x804a1d7,使用examine指令顯示這個字串為”Simplicity favors regularity.”,
圖4 phase_0通過
單步或繼續執行后續的代碼時輸入這個字串,結果顯示成功過關,
第零關(phase_0)已破解!!!
階段1
phase_1
圖5 phase_1源代碼及分析
圖6 phase_1源代碼及分析
先使用gdb查看第二關所需要輸入的型別:
圖7 phase_1gdb查看輸入格式
由gdb除錯得知,在第二關需要輸入的是兩個整數,由于計算浮點數時出現計算問題,所以,在這一關采用查看暫存器內容的方法來解決,
此次需要使用的指令分別是:si;finish;disas;info registers
兩次查看地址分別為0x080494f1和0x08049504
整個的程序如下:
先設定斷點,然后在斷點之前是要進行輸入第零關和第一關的結果,因為兩關之間無關聯,所以節省時間第零關隨便輸入即可,到了第一關要根據gdb得到的格式輸入,
第二步,再用si進行跳轉,當出現80494ca這一行的呼叫函式陳述句的時候,用finifh指令,
第三步,呼叫完finish之后,先用空格使得整個的代碼能完整的呈現出來,然后在左側你可以通過一個小箭頭看到當前代碼執行的地方,觀察整個的代碼,找到兩次比較出現的地址,
第四步,用si進行跳轉,到第一次比較的地方的時候用info registers進行第一次查看,
第五步,查看到第一個數字之后,退出這一輪,重新進行第二次查看的程序,(往下翻,兩張圖之后有注意的點,一定要耐心看)
第六步,得到兩個數字,進行驗證,
圖8 查看暫存器內容得到第二關的通關碼
圖9 查看暫存器內容得到第二關的通關碼
這里非常需要注意的點是(雖然有點繞,但是我相信挑戰拆彈實驗的你一定能看懂):
要耐心哦!
當通過gdb得到了輸入格式之后(以我自己的為例),在第一次的查看暫存器的內容的時候,需要輸入的是兩個任意的整數,這樣就可以通過info registers查看我所需要輸入的第一個數字,在第一個數字得到之后,要做的結束此次查看的程序,重新進入第二次查看暫存器的內容,前面設定斷點等操作都一樣,不同的是,當輸入兩個數字的時候,就必須先輸入我剛得到的正確的數字,第二個數字就可以寫一個任意的整數,然后用si進行跳轉,用info registers陳述句查看,
(這樣操作的原因是,第一個數字輸入正確與否,之后的陳述句跳轉都依賴它,如果第一個數字輸入錯誤,那么接下來就會跳轉到炸彈爆炸的陳述句,第一次查看暫存器的時候,我任意輸入了兩個整數,當我得知了第一個正確的數之后,如果繼續,必然爆炸,)
驗證第二關答案,結果顯示已過關
圖10 phase_1通過
第一關(phase_1)已破解!!!
階段2
圖11 phase_2源代碼及分析
圖12 phase_2源代碼及分析
注意注意注意哈!
這里一定要先找到輸入數字是多少個,然后把回圈條件找到,再進行運算就可以算出來了!
細節如下:
通過對源代碼的分析,找到了它的回圈條件和回圈體,對其進行運算:
number[i]=number[i-2]/2+1
又知,初始數字為0xb2=178 即number[0]=178,
number[1]=178/2+1=90;
number[2]=90/2+1=46;
number[3]=46/2+1=24;
number[4]=24/2+1=13;
number[5]=13/2+1=7,
驗證第三關所得答案,結果顯示已過關,
圖13 phase_2通過
第二關(phase_2)已破解!!!
階段3


圖14 15 16 phase_3源代碼及分析
在無法獲得源程式的情況下,只能通過對可執行程式進行反匯編來獲得程式的匯編代碼,觀察bomb.s對應的匯編代碼,分析源程式的功能,
圖17 通過gdb查看確定輸出兩個整數
這里輸入格式也可能是“%d %c %d"(我朋友的就是),但是都大同小異,只要初始條件和回圈找得好,破解這一關就不難,
結合源代碼可以發現,程式內部對將要輸入的第一個數字的要求是減去52后的值小于9,第二個輸入數字應該根據第一個輸入的整數的值來判斷程式轉到哪個分支執行,從而確定第二個數字的值應該輸入哪個,
假設輸入值為55,然后通過計算在gdb中查看表基址,
圖18 gdb查看表基址
根據所找到的0x08049607在bomb.s中查看跳轉,然后得到了對應的結果176,驗證成功,
(一定要看好自己的跳轉)
圖19 phase_3通過
第三關(phase_3)已破解!!!
階段4



圖20 21 22 23 phase_4和func4源代碼及分析
gdb進行除錯確保推算的數字是正確的,

圖24 25 驗證推算的數字的正確性
這里其實我的方法更偏向于暴力拆解,整個程序類似于前文中的第一關,是查看暫存器內容得到的,(這里不足的地方我會通過之后的博客進行補充,或者有朋友有其他方法也可私信我,我們一起討論呀!)
驗證第四關的結果:
圖26 第四關破解
第四關(phase_4)已破解!!!
階段5

圖27 28 phase_5源代碼及分析
這里用到了一個回圈,可能一開始會比較懵,所以我先利用gdb查看了代碼中明地址中到底存放了啥,于是就有了下圖:
圖29 第一個明地址中存放的內容

圖30 第二個明地址中存放的內容
乍一看,這都是啥,仔細一看,第二個明地址中有的字符第一個都有,這說明啥?
于是我想到了回圈、指標、和索引!
應該就是根據回圈,在一堆字符中找幾個字符的那種
然后又有了下圖
圖31 明地址找索引
由圖31得知,此關的通關密碼為ichf`knl
驗證結果正確:
圖32 phase_5通過
這里其實我見到的更多的是給定一個數字,然后找出小于另一個數字的八九個數字之和是給定的這個數字,然后類似于我手寫的那種找索引,再看ASCII碼表把數字翻譯出來就可以了,
第五關(phase_5)已破解!!!
階段6




圖33 34 35 36 37 phase_6源代碼及分析
在此關中,對源代碼進行分析,發現最終輸出的結果是按照升序排列數字然后輸出:
圖38 設定斷點然后查看
對所得數字進行驗證,得知最后得結果為5 2 4 7 1 3 6
圖39 phase_6通過
(這里其實有一點小暴力拆解的意思,有興趣的朋友可以和我一起討論哈!)
第六關(phase_6)已破解!!!
階段7
這里的階段七是對隱藏關進行破解的,剛開始我其實沒有發現這個,這個隱藏關是我朋友發現的,

圖40 41 隱藏關入口
對隱藏關中的匯編進行分析,然后再通過gdb查看明地址中得內容,最終可得知隱藏關的入口在phase_4,密碼為mcReh
圖42 隱藏關密碼及其格式
在這里包含了一個小點,隱藏關的密碼是緊跟在兩個整數之后的,結合之前的破解以及分析(我徒手使試出來的),第一種情況如果將隱藏關密碼同時加在phase_1;phase_3;phase_4之后,隱藏關是可以進入的,但是如果在phase_1或者phase_3二者之一加上密碼的時候,關卡可以通過,但是不能進入隱藏關,(也就是phase_4后面不加的話就不能進入隱藏關,)所以,第二種情況就是僅僅在phase_4之后加上隱藏關的密碼是可以進入隱藏關的,這也是結合匯編分析出來的結果,
這里我的猜想是,指標掃描,是一個個掃的,格式相同的后面加東西,指標應該會掃出來,而且還覺得是對的,但是在格式不一樣的后面加東西,指標就會認為你破解有誤(srds這是我的猜想,有不同意見的可以和我交流)


圖43 44 第一種和第二種情況的對比
(這里就有我的猜想的驗證,不過不一定正確,)
沖向隱藏關
Secret_phase



圖45 46 47 48 隱藏關
這里其實整的挺復雜,不過不要怕,咱們有gdb,
先找明地址,然后用gdb看看里面是啥,

圖49 50 gdb查看
然后我連帶著代碼一起分析出了以下內容:
A2+1=5 - ->A=2 即有 * A<B
A2=2 -->A=1 有 * A>B
A*2+1=1 - ->A=0 即有 * A<B(假設fun7中呼叫的是A B)
三次遞回中兩次執行了 “若 * A<B 將(A+8) 作為地址進入遞回”系列代碼,一次執行了 “若 * A>b,將(A+4) 作為地址進入遞回”系列代碼,使用 gdb 查詢儲存值,發現:
0x2f=47
驗證結果:
圖51 隱藏關破解
隱藏關(secret_phase)已破解!!!
整體通關圖:
圖52 正式通關
到這里,所有的關卡都已經通過!!!
哇哈哈!二進制炸彈破解正式結束啦!總而言之就是希望對大家有幫助,如果有人想和我一起討論這個實驗的話,歡迎和我一起來玩呀!
——張渣渣_
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/99742.html
標籤:其他
