CSAPP Lab:Bomb Lab——從拆彈到爆炸。。。


 

這個實驗的要做的是用gdb逆向一段code,通過查看匯編代碼以及單步調試找出這段code需要你填入的字符串,好像每個人都不一樣,所以每個人都需要找到自己的拆彈密碼,很有意思。

實驗一共有6關,我們一關關來看一下:

phase_1

打開bomb.c看些c源碼(這里的核心方法已經被刪除了,只能看到最外層的代碼,但能得到一些線索)。

很容易就發現這個phase_1方法是第一題的核心方法,直接逆向它,看下它的匯編。

第一句話是在為函數棧開辟空間,第二句話是關鍵,將一個立即數賦值給%esi,然后就調用strings not equal方法,推測很用可能這個寄存器中就存着我們拆彈的字符串,於是打斷點,單步執行,查看%esi的里的內容:

沒錯,這就是我們拆彈的鑰匙了,輸入,第一個炸彈成功拆除!可以將答案放在一個文本文件中,方便之后的解題。

phase_2

 直接逆向phase_2函數觀察下

 

觀察read_six_numbers發現這次是要我們輸入6個數字,通過觀察后發現輸入的6個數字會依次3存在%rsp,%rsp+4,%rsp+8,%rsp+12...%rsp+24這些位置,那么cmpl $0x1,(%rsp)這句話就很明顯可以得出第一個數字是1,再接下去看跳轉到52,將%rsp+4也就是第二個數字放進%rbx中,將%rbp設置成%rsp+24(可以猜到%rbp使用來判斷循環是否退出的寄存器),之后跳轉到27,這里將第一個數賦值給%eax,將%eax*2去和第一個數對比,如果相等就繼續,以此類推,可以發現這個循環就是用來判斷輸入的數字是否依次增大一倍的,所以第二題的拆彈密碼就是:1 2 4 8 16 32

phase_3

我首先隨意輸入一個字符串,調試發現%esi中的字符串內容為"%d %d",由此得知此題需要我們輸入兩個數字,%eax是scanf的返回值,如果=1則代表非法輸入,炸彈爆炸。我們輸入兩個數字,這里跳轉就能通過了。然后發現第一個數字不能大於7,我們隨意填了個0,重新調試再試試,然后發現jmp到了57,走下去會發現%eax就是第二個數的答案,所以此題答案為0 0xcf。

其實這道題最簡單的解法就是輸入兩個數,跟着單步調試走,你很容易就能確定兩個數字的內容,但是其實你再多看兩眼,就會發現其實這里是一個switch結構,答案是不唯一的,跳轉表存在*0x402470中,我們打印出這張跳轉表,就能得知這道題的所有答案:第一個數字是index,第二個數字就是對應分支賦值給%eax的值。

 phase_4

 這道題是個遞歸,花了點時間,但是復雜度還行,只要一步步跟下來就能得出結果。

拆彈關鍵在func4函數中,發現func4返回的參數eax必須為0才能不爆炸,我們倒退進func4

發現只有當%ecx和%edi的值相等的時候才會將%eax賦值為0,而%edi就是我們的第一個參數,那么我們只需要知道%ecx的值即可,通過推導得出ecx的值可以為7 3 0。

返回phase_4繼續走下去發現第二個數為0就能拆彈了。

 

phase_5

通過這段我們可以知道這一題是要我們輸入一串長度為6的字符串。

這一段是核心代碼,跳轉至112后將%eax賦值為0后跳轉到41,然后講%rbx+%rax的值賦值給%ecx,%rbx是我們輸入內容的基地址,%rax是索引,然后做的事情其實就是將當前字符截取底4位。55行這里有個奇怪的地址,將這個地址輸出看下得到:,那么這里就是以當前字符低4位的值為索引去讀取這個字符串,然后得到的字符放進以$rsp+16為起始地址的內存區域。

解下來可以跳出循環看76-91行了,查看81行的字符串為"flyers",%rdi就是我們循環得到的字符串,然后調用string_not _equal方法,得知只要我們循環得出的字符串等於“flyers”即可拆彈。

分別找到“flyers”在上述字符串中的索引,然后對照ASCII碼表,可得到本題答案,答案不唯一,只要低4位符合條件的字符都能拆彈。

phase_6

這題在借助谷歌的力量后才不太順利的完成了。。

先看第一部分

這部分沒有什么難度,但也有一定復雜度,稍微花點時間理一下邏輯,就能發現它是要我們輸入6個數字,然后這6個數字要求互不相等,並且都不大於6。

接下來就比較困難了,沒想到是用到了鏈表,而且還涉及到數據對齊的知識。

鏈表存儲在0x6032d0中,鏈表得到后再進行排序,最后我們可以得到排序后的鏈表其實是單調遞減了,然后反推就能得出我們的答案啦~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM