2018-2019-1 20165318《信息安全系統設計基礎》第八周課上測試
阿新 • • 發佈:2018-10-29
blog 詳情 main.c gdb調試 gist class 函數調用 rip 機制
2018-2019-1 20165318《信息安全系統設計基礎》第八周課上測試
測試-1-ch03
- 任務詳情
- 通過輸入gcc -S -o main.s main.c,將下面c程序“week04學號.c”編譯成匯編代碼
int g(int x) { return x+3; } int f(int x) { int i = 學號後兩位; return g(x)+i; } int main(void) { return f(8)+1; }
- 刪除匯編代碼中 . 開頭的代碼,提交f函數的匯編代碼截圖,圖中用矩形標出函數棧幀的形成和銷毀的代碼
- 測試截圖
測試-1-ch03
- 任務詳情
- 通過輸入gcc -S -o main.s main.c,將下面c程序“week04學號.c”編譯成匯編代碼
int g(int x) { return x+3; } int f(int x) { int i = 學號後兩位; return g(x)+i; } int main(void) { return f(8)+1; }
- 參考http://www.cnblogs.com/lxm20145215----/p/5982554.html,使用gdb跟蹤匯編代碼,在紙上畫出f中每一條語句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和棧的變化情況。提交照片,要有學號信息。
- 命令匯總:
- “gcc -g week060420165318.c -o week0604 -m32”產生32位匯編,生成可執行文件week0604
- gdb week0604:使用gdb調試器
- (以下為在調試狀態下的輸入)b 10:在主函數處設置行斷點
- r:運行
- disassemble:顯示當前所處函數的反匯編機器碼
- i r:顯示各寄存器的值
- display /i $pc:每次執行下一條匯編語句時,均打印出當前執行的代碼
- si:執行下一條匯編語句
- x/參數 + 棧指針的值:以參數規定的形式查看棧中某地址單元中的值。eg:x/u 0xffffcfe8;x/2a 0xffffcfe0
實驗過程
進入之後先在main函數處設置一個斷點,再
run
一下,使用disassemble
指令獲取匯編代碼
用
i(info) r(registers)
指令查看各寄存器的值
可見此時主函數的棧基址為0xffffd108,用
x(examine)
結合display命令和寄存器或pc內部變量,做如下設置:display /i $pc,這樣在每次執行下一條匯編語句時,都會顯示出當前執行的語句。下面展示每一步時%esp、%ebp和堆棧內容的變化:
call指令將下一條指令的地址入棧,此時%esp,%ebp和堆棧的值為:
將上一個函數的基址入棧,從當前%esp開始作為新基址:
先為傳參做準備:
f函數的匯編代碼:
實參入棧:
call指令將下一條指令的地址入棧:
- 計算short+int:
pop %ebp指令將棧頂彈到%ebp中,同時%esp增加4字節:
ret指令將棧頂彈給%eip:
因為函數f修改了%esp,所以用leave指令恢復。leave指令先將%esp對其到%ebp,然後把棧頂彈給%ebp:
- 寄存器變化情況
指令 | esp | ebp | eax | eip |
---|---|---|---|---|
push %ebp | 0xffffd0fc | 0x56556fdc | 0x56555503 | |
mov %esp,%ebp | 0xffffd0fc | 0xffffd0fc | 0x56556fdc | 0x56555505 |
sub $0x10,%esp | 0xffffd0fc | 0xffffd0fc | 0x56556fdc | 0x56555508 |
call 0x56555549 | 0xffffd0e8 | 0xffffd0fc | 0x56556fdc | 0x56555549 |
add $0x1acf,%eax | 0xffffd0ec | 0xffffd0fc | 0x56556fdc | 0x56555512 |
movl $0x12,-0x4(%ebp) | 0xffffd0ec | 0xffffd0fc | 0x56556fdc | 0x56555519 |
pushl 0x8(%ebp) | 0xffffd0e8 | 0xffffd0fc | 0x56556fdc | 0x5655551c |
call 0x565554ed | 0xffffd0e4 | 0xffffd0fc | 0x56556fdc | 0x565554ed |
add $0x4,%esp | 0x56556fdc | 0xffffd0fc | 0x1d | 0x5655550b |
mov %eax,%edx | 0xffffd0ec | 0xffffd0fc | 0x1d | 0x56555510 |
mov -0x4(%ebp),%eax | 0xffffd0ec | 0xffffd0fc | 0x1d | 0x5655551a |
add %edx,%eax | 0xffffd0ec | 0xffffd0fc | 0x1d | 0x5655552b |
leave | 0xffffd100 | 0xffffd108 | 0x1d | 0x5655552c |
ret | 0xffff104 | 0xffff108 | 0x1d | 0x56555541 |
- 參考資料
- C函數調用機制及棧幀指針
2018-2019-1 20165318《信息安全系統設計基礎》第八周課上測試