首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C程序反匯編分析:函數調用棧幀與控制流圖解

     編輯:關於C語言

簡單 C 程序的反匯編實戰分析

目標程序

int g(int x) { return x + 3; }
int f(int x) { return g(x); }
int main() { return f(8) + 1; }

執行流程圖解

程序加載後從 main 開始執行。關鍵節點分析:

1. main 調用 f(8)

  • 執行到 call f 時,EIP 指向下一條指令地址(圖中 23)
  • 處理器自動將返回地址壓棧(相當於 push EIP)
  • 設置 EIP 為 f 的入口地址(相當於 mov EIP, f)
  • 此時棧幀狀態如圖(5)所示

2. f 執行並調用 g

f 函數體極簡單,直接調用 g 並透傳參數。編譯器可能優化為尾調用,但未優化時會建立獨立棧幀。

3. g 執行並返回

  • g 計算 x + 3,結果放入 EAX(x86 調用約定:返回值在 EAX)
  • 執行 leave 指令(等價於 mov esp, ebp; pop ebp),恢復棧幀
  • ret 彈出返回地址跳轉回 f

4. f 返回 main

f 同樣將結果傳遞給 main,main 加 1 後返回給操作系統。

關鍵匯編指令對照表

指令含義棧操作
call func調用函數壓入返回地址,跳轉
push ebp保存舊棧幀基址棧增長
mov ebp, esp建立新棧幀基址—
sub esp, N分配局部變量空間棧增長
leave銷毀棧幀mov esp, ebp; pop ebp
ret函數返回彈出返回地址到 EIP

調試技巧

  • 使用 gcc -S 生成匯編代碼(.s 文件)
  • objdump -d 反匯編可執行文件
  • GDB 中 disassemble 查看運行時指令流
  • 重點觀察 ebp/esp 變化與參數傳遞位置

理解函數調用的棧幀機制,是掌握緩衝區溢出、ROP 攻擊、調試優化代碼等進階技能的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved