C++虛函數:虛指標、虛表、虛函數入口地址

來源:互聯網
上載者:User

標籤:

測試程式:
//test.c
#include"stdio.h"#include"string.h"class GSVirtual{public:void gsv(char *src){char buf[200];strcpy(buf,src);vir2();}virtual void vir1(){printf("vir1");}virtual void vir2(){printf("vir2");}};int main(int argc,char *argv[]){GSVirtual test;test.gsv(argv[1]);return 0;}
在linux下編譯:$g++ -o vtabletest ./vtabletest.c在ida下查看vtabletest的反組譯碼,找到關鍵函數點 gsv(char *src):

該函數中調用了虛函數vir2(),雖然gsv顯示只有一個參數,但是實際上預設還有另一個參數:虛指標,查看調用gsv時,參數入棧可發現,有兩個參數入棧:
然後,我們回到gsv函數中,其中首先分配了當前棧幀空間:.text:08048538 55                                               push    ebp
.text:08048539 89 E5                                         mov     ebp, esp
.text:0804853B 81 EC F8 00 00 00                  sub     esp, 0F8h
然後,將第一個參數複製到當前棧幀中:注意這個參數就是虛指標的地址(一般在上一個函數的棧幀中).text:08048541 8B 45 08                                      mov     eax, [ebp+arg_0]      //arg0=8
.text:08048544 89 85 24 FF FF FF                      mov     [ebp+var_DC], eax   //var_DC=-0XDC
後面,函數會分配函數的局部變數的棧幀中的位置,然後執行strcpy(buf,src)然後調用虛函數vir2(),我們主要來分析這一段代碼:.text:08048576 8B 85 24 FF FF FF                             mov     eax, [ebp+var_DC]    //將虛指標地址賦值給eax
.text:0804857C 8B 00                                         mov     eax, [eax]         //提取虛指標記憶體位址中的虛表入口地址,一般在.rodata中.text:0804857E 83 C0 04                                      add     eax, 4             //由於調用的是vir2(),因此,該虛函數地址在虛表中的位置位移4*1 bytes
.text:08048581 8B 10                                         mov     edx, [eax]        //提取vir2()虛函數的入口地址
.text:08048583 8B 85 24 FF FF FF                             mov     eax, [ebp+var_DC]   
.text:08048589 89 04 24                                      mov     [esp], eax                //虛指標繼續入棧,可視為為下一個函數調用的參數
.text:0804858C FF D2                                         call    edx            //調用vir2()
在linux中,用gdb調試:在0x8048576處下斷點後,查看相關記憶體資訊:
可對照ida下的彙編代碼看,ebp+8和ebp-0xdc 儲存的都是虛指標地址0xbffff2dc 在上一個函數的棧幀中虛指標指向地址0x80486c8,即虛表地址虛表中按順序儲存了每個虛函數的入口地址。
0x80485a2 和0x80485b6分別就是虛函數vir1()和vir2()的地址:
最後,測試程式存在緩衝區溢位漏洞,在gs保護下,則可通過覆蓋虛表指標來劫持控制流程。

C++虛函數:虛指標、虛表、虛函數入口地址

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.