1. 程式人生 > >計算機系統原理 Bomb實驗 炸彈一/phase_1

計算機系統原理 Bomb實驗 炸彈一/phase_1

Bomb 日誌

實驗準備:

開啟bomb.c檔案,發現檔案中只有主函式,沒有我們需要闖關的具體程式碼,所以考慮如何通過bomb檔案得到六關的具體程式碼,在linux中通過反彙編得到bomb的彙編程式碼,從第一關開始閱讀彙編程式碼,找出闖關的關鍵程式碼。

具體過程:

開啟下載的檔案,通過反彙編得到bomb.s反彙編檔案:

通過vi指令開啟反彙編檔案bomb.s:

 

檢視bomb.s檔案:

 

找到關卡1的反彙編程式碼:

 

分析此段程式碼:

push    %ebp                       將ebp暫存器中的內容入棧
mov     %esp,%ebp                  將esp中的內容複製到ebp中
sub     $0x18,%esp                 分配16進位制18即24個位元組的空間
movl    $0x804a15c,0x4(%esp)       將$0x804a15c處值存入esp+4地址處

mov     0x8(%ebp),%eax             將ebp+8處的值存到eax中
mov     %eax,(%esp)               將eax中的值傳遞給esp
call    8048fab<strings_not_equal>

通過8048fab函式判斷esp+4和esp中的值是否相等test   

%eax,%eax                  判讀eax值是否為0

je      8048f83 <phase_1+0x22>    若eax為0則跳轉到8048f83處


call    80490d1<explode_bomb>      跳轉到80490d1通過函式引爆炸彈



leave                              結束,eax為0時進入下一關
ret

本題的棧幀結構如下圖所示:


拆除炸彈一即不讓第一段程式進入爆炸。分析程式碼,整段程式碼就是先將存有目標字串的地址$0x804a15c先存入了當前幀,再將外部輸入的字串存入到ebp+8的位置,即上圖所示的引數一,再通過eax將引數一傳遞到esp中,通過函式呼叫比較esp與esp+4中的字串是否相等,如果相等,返回值為0,程式跳轉到leave,進入下一程序,反之不相等則引起爆炸,所以我們只需要檢視地址$0x804a15c處的值就能解除炸彈危機了。

 如下圖所示,使用GDB檢視指定地址儲存的資料:

 

所以易知:

第一關炸彈可使用字串

“We have to stand with our North Korean allies”來進行拆除。