函数调用栈

简介:

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

}

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

wKiom1cDldCR5AFsAAATEw7HeOs758.png


结构分析:

wKiom1cDq2nQEgJCAAA2z5M_JeA577.png执行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函数中去,会导致关机。

1
<br>










本文转自 ye小灰灰  51CTO博客,原文链接:http://blog.51cto.com/10704527/1760698,如需转载请自行联系原作者
目录
相关文章
|
22天前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
35 0
|
2月前
【栈】数据结构栈的实现
【栈】数据结构栈的实现
|
2月前
|
存储
数据结构--栈和队列
数据结构--栈和队列
|
2月前
|
存储 算法 数据处理
数据结构从入门到精通——栈
栈,作为一种后进先出(LIFO)的数据结构,在计算机科学中扮演着重要的角色。它的特性使得它在处理函数调用、括号匹配、表达式求值等问题时具有得天独厚的优势。然而,如果我们跳出传统思维的束缚,会发现栈的用途远不止于此。
59 0
|
2月前
|
C语言
数据结构之栈详解(C语言手撕)
数据结构之栈详解(C语言手撕)
37 1
|
2月前
|
存储 算法
数据结构— —栈的基本操作(顺序栈和链栈)
数据结构— —栈的基本操作(顺序栈和链栈)
61 0
|
5天前
|
C语言
数据结构中顺序栈的进栈和出栈用C语言表示
数据结构中顺序栈的进栈和出栈用C语言表示
13 1
|
15天前
|
存储 算法 调度
数据结构期末复习(3)栈和队列
数据结构期末复习(3)栈和队列
19 0
|
27天前
|
存储 缓存 算法
【算法与数据结构】栈的实现详解
【算法与数据结构】栈的实现详解