1. 程式人生 > >2018-2019-1 20165318《信息安全系統設計基礎》第八周課上測試

2018-2019-1 20165318《信息安全系統設計基礎》第八周課上測試

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)

      指令查看內存地址中的值,但目前%esp所指堆棧內容為0,%ebp所指內容也為0
      技術分享圖片

    • 結合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《信息安全系統設計基礎》第八周課上測試