GDB調試匯編堆棧過程分析


GDB調試匯編堆棧過程分析

  • 這時需要使用sudo apt-get install libc6-dev-i386命令安裝一個庫之后就可以產生匯編代碼了。說是這么說,但是真的要弄好就,烏邦圖源弄了好久。

  •  

  • disassemble獲取匯編代碼,若命令不帶參數,默認的反匯編范圍是所選擇幀的pc附近的函數。info registers列出使用的寄存器.

       

  • 使用x 0xffffd048指令查看內存地址中的值,但目前%esp所指堆棧內容為0,%ebp所指內容也為0。

  • display,設置程序中斷后欲顯示的數據及其格式。使用命令display /i $pc每次程序中斷后可以看到即將被執行的下一條匯編指令,可以 其中 $pc 代表當前匯編指令,/i 表示以十六進行顯示。

  • si執行一條匯編指令

  • %esp、%ebp(info registers)和堆棧內容的變化(x/na %esp)

一直使用以上三個指令,觀察其變化

  • call將下一條指令的所在地址(即當時程序計數器PC的內容)入棧

  • 將上一個函數的基址入棧,將當前%esp作為新基址。

  • 准備傳參

  • 計算在%eax中進行

  • 查看f函數的匯編代碼

  • 執行g函數,g初始化棧指針

  • g分配棧空間

  • 計算short+in

  • pop %ebp指令將棧頂彈到%ebp中

  • ret返回g中call的調用位置

  • 釋放當前子程序在堆棧中的局部變量,恢復被函數修改的%ebp和%esp

  • 主函數匯編代碼 

  • 進入main函數, %esp加立即數4

  • 將%edx於%eax相加

  • leave返回准備棧

  • ret結束main函數

指令 %eip %esp %ebp %eax 堆棧
push $0x8 0x804840b 0xffffd048 0xffffd048 0xf7fb8dbc 0x0
call 0x80483ef 0x804840d 0xffffd044 0xffffd048 0xf7fb8dbc 0x8 0x0
push %ebp 0x80483ef 0xffffd040 0xffffd048 0xf7fb8dbc 0x8048412 0x8 0x0
mov %esp,%ebp 0x80483f0 0xffffd03c 0xffffd048 0xf7fb8dbc  
mov 0x804a01c,%edx 0x80483f2 0xffffd03c 0xffffd03c 0xf7fb8dbc 0xffffd048 0x8048412 0x8 0x0
mov 0x8(%ebp),%eax 0x80483f8 0xffffd03c 0xffffd03c 0xf7fb8dbc 0xffffd048 0x8048412 0x8 0x0
call 0x80483db 0x80483fe 0xffffd038 0xffffd03c 0xa 0xa 0xffffd048 0x8048412 0x8 0x0
push %ebp 0x80483db 0xffffd034 0xffffd03c 0xa 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
mov %esp,%ebp 0x80483dc 0xffffd030 0xffffd03c 0xa 0xffffd03c 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
ret 0x80483ee 0xffffd034 0xffffd03c 0xb 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
leave 0x8048406 0xffffd03c 0xffffd03c 0xb 0xffffd048 0x8048412 0x8 0x0
ret 0x8048407 0xffffd040 0xffffd048 0xb 0x8048412 0x8 0x0
add $0x4,%esp 0x8048407 0xffffd040 0xffffd048 0xb 0x8 0x0
leave 0x804841c 0xffffd048 0xffffd048 0xe  
ret 0x804841d 0xffffd04c 0x0 0xe


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM