函数调用栈

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



你可能感兴趣的:(函数,栈,调用)