您好,登錄后才能下訂單哦!
因為linux下的截圖工具不會用,所以下面的代碼是在VS下跑的。
#include<stdio.h>
#include<stdlib.h>
void bug()
{
system("reboot");//重啟
exit(0);
}
int stack_test(int a, int b)
{
printf("before write :0x%x\n", b);
int *p = &a;
p++;
*p = 0xdddd;
printf("after write :0x%x\n ", b);
int c = 0xcccc;
return c
}
int main()
{
int a = 0xaaaa;
int b = 0xbbbb;
int ret = stack_test(a, b);
printf("you should run here\n");
return 0;
}
執(zhí)行上面的代碼,結構為:
結構分析:
執(zhí)行int *p = &a,此時p指向了&a,當進行p++時,此時p指向了&b,然后*p = 0xdddd,則把b內(nèi)的值改為
0xdddd,所以write之后打印的是0xdddd。
當執(zhí)行下面代碼:
#include<stdio.h>
#include<stdlib.h>
void
bug()
{
system
(
"reboot"
);
//重啟
exit
(0);
}
int
stack_test(
int
a,
int
b)
{
int
* p=&a;
p--;
*p=bug;
int
c=0xcccc;
return
c;
}
int
main()
{
int
a=0xaaaa;
int
b=0xbbbb;
int
ret=stack_test(a,b);
printf
(
"you should run here\n"
);
return
0;
}
當進行p--時,p指向了返回地址,然后執(zhí)行*p = bug,會使返回地址的內(nèi)容變?yōu)閎ug的ebp,所以當stack_test函數(shù)執(zhí)行完后,不會執(zhí)行main函數(shù)中的printf,而是跑到bug函數(shù)中去,會導致關機。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。