計算機系統原理 Bomb實驗 炸彈一/phase_1
Bomb 日誌
l 實驗準備:
開啟bomb.c檔案,發現檔案中只有主函式,沒有我們需要闖關的具體程式碼,所以考慮如何通過bomb檔案得到六關的具體程式碼,在linux中通過反彙編得到bomb的彙編程式碼,從第一關開始閱讀彙編程式碼,找出闖關的關鍵程式碼。
l 具體過程:
開啟下載的檔案,通過反彙編得到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檢視指定地址儲存的資料:
所以易知:
第一關炸彈可使用字串