程序執行時,棧指針ESP和棧頂指針EBP的變化
進入main函數的時候,
1)保存ebp指針
2)使得ebp->esp
3)保持現場ebx,esi,edi
4)進入一般函數的時候,push參數,例如有n個參數 esp = esp - 4*n
5)push函數返回地址 esp = esp -4
6)調用函數 EIP指向函數地址,jmp 函數地址
7)Push ebp 保存 (故有[ebp+8]就是第一個參數的內容)
8)使得ebp ->esp, esp = esp - 40h - 臨時變量需要字節數(有字節對齊問題)
9)保持現場ebx,esi,edi
10)返回值=》eax
11)恢復現場,就是依次pop出edi,esi,ebx,
12)Esp = ebp
13)Pop ebp
14)pop 函數返回地址(即ret),EIP指向下個指令地址 esp = esp +4
15)Esp + n*4 (每個字有4個字節);push是按字操作的,32位機器
知道這些后,程序的溢出就比較容易做了。
http://hi.baidu.com/goodallen/blog/item/1a2e23fc07b7e487b901a0cb.html/cmtid/494b414bcea227fc82025ca2
posted on 2012-02-29 17:17 厚積薄發 閱讀(1325) 評論(0) 編輯 收藏 引用 所屬分類: C/C++