C语言栈与调用惯例
C语言 调用
2023-09-14 09:00:38 时间
1、前言
最近在再看《程序员的自我修养》这本书,对程序的链接、装载与库有了更深入的认识。关于这本书的评价可以去豆瓣看看http://book.douban.com/subject/3652388/,强烈推荐给每一位程序员哈。今天看了第十章内存,主要讲的是栈和堆的管理。主要问题是:函数在栈中是如何布局的,如何通过缓冲区溢出来调用另外一个函数,即堆栈溢出攻击。
2、基本概念
栈(stack):我第一次接触栈是从数据结构中,此时的栈是一种基本数据结构,栈的基本属性是先进后出(FILO)。
在计算机系统中,栈是一个具有先进后出属性的动态内存区域。程序可以将数据压入栈,也可以将数据从栈顶弹出。栈的增长方向是向下增长,即由高地址向低地址方向。在i386下,esp寄存器定位栈顶,ebp寄存器定位栈底(栈指针)。esp始终指向栈顶,随着函数的执行,esp不断的变化,而ebp固定在栈底位置不变。
3、栈的作用
用于维护函数调用的上下文,离开了栈函数调用没法实现。栈中保存了一个函数调用所需要的维护信息,通常称为堆栈帧或活动记录。
堆栈栈包括的内容:
(1)函数的返回地址和参数
(2)临时变量
(3)保存的上下文,例如函数调用前后保持不变的寄存器。
4、函数调用过程
(1)把所有的参数压入栈
(2)把当前指令的下一条指令的地址压入栈中(函数的返回地址)[可以实现堆栈溢出攻击]
(3)跳转到函数体执行
其中(2)(3)由指令call一起执行的。
例如下图所示的程序:
汇编代码如下图所示:
5、堆栈溢出攻击
通过堆栈溢出改变函数的返回地址,调用另外一个过程。例如下面的程序:
汇编程序如下所示:
程序输出结果如下所示:
相关文章
- C语言:数组作为函数参数(数组元素做实参,数组名称做形参)
- C语言:将一个字符串转成对应的数字,如字符串“123”转换成123,假设字符串中所有字符都是数字字符。
- 【Linux + C语言】话说,你真的了解system接口的调用吗?
- C语言创建对称矩阵
- C语言深入理解extern用法 | 变量声明 | static
- C语言log()函数:返回x的自然对数(以e为底的对数)
- C语言与Oracle编程完全指南(coracle编程)
- 文件Linux下的C语言调用动态链接库文件实践(linuxc调用so)
- Linux下C语言编程入门
- C语言中实现Linux命令交互(c语言调用linux命令)
- 使用linux C语言调用Lua脚本(linuxc调用lua)
- C语言vs引用MySQL比较优秀的数据库解决方案(c vs引用mysql)
- 使用C语言中的MySQL输入语句编程(c mysql输入语句)
- 实现MySQL登录功能一步一步学习C语言(c mysql登录功能)
- C语言和MYSQL深度数据清理技术(c mysql清理)
- MySQL中使用C语言编写查询方法实现数据检索(c mysql查询方法)
- MySQL实战C语言编程技巧(c mysql实战)
- C语言与Oracle的完美结合(c 配oracle)
- C语言调用Oracle数据库操作方法(c 调用oracle方法)
- C语言调用Oracle数据库实现数据交互(c 调用oracle库)
- C语言调用Oracle序列化实现高效率编程(c调用oracle序列化)
- 精准掌握C语言与Oracle拼接规范(c oracle拼接规范)
- 混合开发助力企业信息化C语言PHP和MySQL联动提升系统性能(c php mysql)
- 编写的函数Oracle中使用C语言编写的函数的实现(oracle中调用c语言)
- C语言-内存函数的实现(二)之memmove
- C语言中函数声明与调用问题