32k通過位址跳轉到函式 彙編層面分析函式呼叫

2021-10-16 07:07:22 字數 1781 閱讀 9709

​我們自己的寫的**在電腦上執行的時候,是怎麼執行的呢。一般會有這麼幾個問題?
棧在記憶體中是一塊特殊的儲存空間,它的儲存原則是「先進後出」,即最先被儲存的資料,最後被釋放。彙編過程通常使用 push 和 pop 指令對棧進行壓入和彈出的操作。

棧在程式執行的過程中很重要,棧儲存了乙個函式呼叫所需要維護的資訊:

暫存器是cpu的組成部分,因為在cpu內,所以cpu對其讀寫速度是最快的,不需要io傳輸。

暫存器的用途:

通用暫存器

eax 累加和結果暫存器

ebx 資料指標暫存器

ecx 迴圈計數器

edx i/o指標

esi 源位址暫存器

edi 目的位址暫存器

esp 堆疊指標

ebp 棧指標暫存器

指令暫存器

eip 標誌當前程序將要執行指令位置

下圖是程序的位址空間布局

函式引數壓棧 返回位址壓棧, 使用push和pop指令

跳轉到函式所在**處執行, 使用call指令呼叫函式

執行函式**

找出返回位址並跳回,然後平衡堆疊

呼叫約定堆疊平衡方式__stdcall函式自己平衡__cdecl呼叫者負責平衡__thiscall呼叫者負責平衡__fastcall呼叫者負責平衡__naked有編寫者負責

下面是一段c++**:

int add(int a, int b)

int sub(int a, int b)

int main()

編譯後,生成可執行檔案,用 od 動態除錯,下面是是main函式的彙編**,關於重點的彙編**都有注釋,可以按流程自己一步一步看下。

在呼叫 add 函式的時候,我們看到是用 call 指令加上 add 函式的位址,直接進入的 add 函式,這個時候的棧變化是這樣的,如圖

在棧中壓入 a, b 兩個引數,然後再壓入了返回位址,這個位址很關鍵,因為它控制了執行完呼叫的函式後,應該返回到那個位址執行接下來的**,我們常見的緩衝區溢位漏洞,就是通過溢位的位元組碼,來覆蓋掉這個位址,使得返回位址跳轉的自己的的位址,執行自己的 shellcode

下面的彙編比較簡單,就是 add 函式裡面實現了兩個引數相加的彙編

呼叫完成 add 函式後, 我們看到 esp 通過加減的方式來增加和縮小自己當前的棧空間,最關鍵的是 add 函式中 a+b 的結果是通過暫存器 eax 返回到了 main 函式中。

這就是乙個完整的呼叫函式的流程,後面的 sub 函式也是這個流程。

32k通過位址跳轉到函式 C語言結構化程式設計之函式

可重用性是一種編寫 並多次使用它的方法。使用結構化程式設計技術,我們編寫一次 並多次使用它。結構化程式設計還使程式易於理解,提高程式質量,易於實現並減少時間。在c語言中,可以使用函式概念來設計結構化程式設計。使用函式概念,我們可以將較大的程式劃分為較小的子程式,並且這些子程式是單獨實現的。c語言中的...

QT通過IP位址定位位址

通過ip位址定位位址,是要通過查詢資料庫,如果自己做乙個這樣的資料庫工作量就比較大,所以在網上找了乙個查詢ip位址的 通過呼叫這個 查詢來實現,但是這個有一定的弊端,如果沒有網路或者這個 不可用時,就無法查詢。具體 如下 qeventloop loop qnetworkaccessmanager m...

通過IP獲取MAC位址

option explicit private declare function openprocess lib kernel32 byval dwdesiredaccess as long,byval binherithandle as long,byval dwprocessid as long...