函数调用栈

因为linux下的截图工具不会用,所以下面的代码是在VS下跑的。

成都创新互联公司是一家集网站建设,延平企业网站建设,延平品牌网站建设,网站定制,延平网站建设报价,网络营销,网络优化,延平网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

#include

#include

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
#include
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函数中去,会导致关机。



标题名称:函数调用栈
本文网址:http://ybzwz.com/article/jgjegd.html