函数调用栈
因为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://scyanting.com/article/jgjegd.html