標籤:pre input log exp def 命令 2-2 方法 一個
這裡是第二關,在這裡分享一些在解題過程中用到的GDB功能。
首先,要進行斷點,比如,在第二關中,斷點操作有:
81: input = read_line();82: phase_2(input);83: phase_defused();
break 81; break 82; break 83; 分別在read_line,phase_2,phase_defused,三個函數入口進行了斷點。
另外,還有一個地方需要斷點,那就是explode_bomb;操作:break explode_bomb。
之後可以使用跳轉命令直接在運行到斷點後跳轉到某個函數 或某個地址。在這個lab裡我經常用的是jump *0x地址。直接跳轉到read_line函數,這樣就不用再後邊的關卡中非要一關一關地輸入,直到正在調試的那一關。為了正確跳轉到read_line,我需要知道那一關的read_line函數地址,這個地址可以通過info break(顯示斷點資訊)得到。
,info break得到斷點地址後,jump直接跳轉到函數入口。 eg:jump *0x400e4e。
同時,還需要進行單步運行調試,查看寄存器值。用 layout regs 命令可以做到。然後 si , ni ,進行逐步執行(si會運行進入被調用函數內,ni不進入調用函數)
然後是查看記憶體的命令:x/(n/f/u) 0x地址。百度查詢多種用法,這就不一一贅述了。
************************************************************************************************************************************************
分割線
************************************************************************************************************************************************
這裡貼上phase_2的解題方法,通過注釋的形式寫出來了。
0000000000400efc <phase_2>: 400efc: 55 push %rbp 400efd: 53 push %rbx 400efe: 48 83 ec 28 sub $0x28,%rsp 400f02: 48 89 e6 mov %rsp,%rsi 400f05: e8 52 05 00 00 callq 40145c <read_six_numbers> 400f0a: 83 3c 24 01 cmpl $0x1,(%rsp) ;如果第一個數(sp)不等於1,bomb. 400f0e: 74 20 je 400f30 <phase_2+0x34> 400f10: e8 25 05 00 00 callq 40143a <explode_bomb> 400f15: eb 19 jmp 400f30 <phase_2+0x34> 400f17: 8b 43 fc mov -0x4(%rbx),%eax 400f1a: 01 c0 add %eax,%eax 400f1c: 39 03 cmp %eax,(%rbx) ;如果第一個數的2倍不等於第二個數,bomb. 400f1e: 74 05 je 400f25 <phase_2+0x29> ;eg:1*2 == 2;第二個數為2; 400f20: e8 15 05 00 00 callq 40143a <explode_bomb> 400f29: 48 39 eb cmp %rbp,%rbx 400f25: 48 83 c3 04 add $0x4,%rbx ;棧指標+1,向後移位(檢查後邊的數字) 400f2c: 75 e9 jne 400f17 <phase_2+0x1b> ;如果移位沒有到最後一個數字(第六個) 400f2e: eb 0c jmp 400f3c <phase_2+0x40> ;迴圈執行檢查. 400f30: 48 8d 5c 24 04 lea 0x4(%rsp),%rbx ;%rbx儲存第2位元字的起始地址。(資料棧頂) 400f35: 48 8d 6c 24 18 lea 0x18(%rsp),%rbp ;%bpx儲存最後第6位的結束地主。(資料棧底) 400f3a: eb db jmp 400f17 <phase_2+0x1b> 400f3c: 48 83 c4 28 add $0x28,%rsp 400f40: 5b pop %rbx ;按規律得出答案 "1 2 4 8 16 32". 400f41: 5d pop %rbp 400f42: c3 retq
得出第二關的答案“1 2 4 8 16 32”
CSAPP 3e: Bomb lab (phase_2) + lab中的GDB 使用