您好,登錄后才能下訂單哦!
程序代碼: 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void bug() 5 { 6 system("reboot"); 7 exit(0); 8 9 } 10 int stack_test(int a,int b) 11 { 12 //int *p=&a; 13 //p--; 14 //*p=bug; 15 printf("before write : 0x%x\n",b); 16 int *p=&a; 17 p++; 18 *p=0xdddd; 19 printf("after write : 0x%x\n",b); 20 int c=0xcccc; 21 return c; 22 23 } 運行結果: before write :0xbbbb; after write:0xdddd;
分析結果:
因為棧是向下生長的并且由高地址向低地址,函數調用時參數從右向左壓棧,
當第一次取b的地址時還是原來的,當指針p取到a的地址并向后加時,已經指向b,此時*p 改變b的地址
,所以after之后的地址為0xdddd。
如果放開注釋過的內容,p--之后指向返回地址,將bug函數地址存入返回地址處,因此跳轉到bug函數,會重啟電腦。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。