温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

函数调用栈

发布时间:2020-07-15 07:59:00 来源:网络 阅读:314 作者:ye小灰灰 栏目:编程语言

因为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;

}

执行上面的代码,结构为:

函数调用栈


结构分析:

函数调用栈执行int *p = &a,此时p指向了&a,当进行p++时,此时p指向了&b,然后*p = 0xdddd,则把b内的值改为

0xdddd,所以write之后打印的是0xdddd。

当执行下面代码:

#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指向了返回地址,然后执行*p = bug,会使返回地址的内容变为bug的ebp,所以当stack_test函数执行完后,不会执行main函数中的printf,而是跑到bug函数中去,会导致关机。



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI