当前位置: 首页 > news >正文

二进制安全研究员的成长之路---栈溢出篇(一)

#1024程序员节|征文#
首先我们要知道系统的栈是做什么的

1.内存的用途

内存在使用过程中可以大致分为以下

  1. 代码区
  2. 数据区
  3. 堆区:这部分主要用于在进程中动态的去申请一定大小的内存,并在用完之后进行回收.
  4. 栈区:栈区主要用于动态的存储函数之间的调用关系
    以PE文件为例:PE文件在经过Windows系统的编译和链接后,会被装载运行,在一开始,其代码会被放进.text区域
    ,随后开始进行动态分配的堆区紧接着发生函数调用时,会使用栈区保存调用关系等信息

2.栈

栈是一种十分方便的数据结构,具有FILO的特点
一般有以下特征:

  1. pop 出栈 将栈顶元素弹出
  2. push 入栈 将某一元素压入栈顶
  3. TOP :指栈顶的位置,也就是低地址处
  4. BASE:栈底,是高地址处
    栈的增长方向是从高地址向低地址处增长,与堆恰恰相反

3.函数调用时到底发生了什么?

以以下代码为例:

int func_B(int arg_B1,int arg_B2)
{int var_B1,var_B2;var_B1  = arg_B1;var_B2  = arg_B2;return var_B1 * var_B2';
}
int func_A(int arg_A1,int arg_A2)
{int var_A;var_A  = func_B(arg_A1,arg_A2) +arg_A1;return var_A;
}   
int main(int argc, char **argv, char **envp)
{int var_main;var_main  = func_A(4,3);return var_main;
}

在这个例子里我们创建了两个函数 一个是func_B另一个是func_A
其中 func_Afunc_B调用参数 随后放到main函数中一起调用;
调用顺序是:

main--->func_A--->func_B

我们应该搞清楚而且必须很清楚这main函数在一步一步的调用后面的函数的时候,是怎么去调用的,调用完又是如何返回的
搞清楚这点,相信对于栈的理解就很清晰了
简单的来看,是先从main函数开始,当调用func_A的时候进行压入栈,这个时候将返回地址(自身的)压入栈中,随后开始开辟func_A的栈,随后func_B也是如此,在调用func_B时,将func_A的返回地址压入到自己的栈帧中,随后再将func_B入栈
这样就保证了在fun_B完成后,访问func_A的返回地址回到func_A,在func_A完成后,访问main的返回地址回到main函数了

1024快乐~
剩下的内容更精彩~!


http://www.mrgr.cn/news/57917.html

相关文章:

  • (gersemi) CMake 格式化工具
  • 【C++智能指针深度解析】std::shared_ptr、std::unique_ptr与std::weak_ptr的构造、原理及应用实战
  • 基于Python实现“气象家园”自动签到
  • 上传大文件到Github
  • tomcat安装启动配置以及乱码问题
  • css-(-webkit-、-moz-、-o-)前缀主要用于CSS和某些HTML属性,确保跨浏览器的兼容性和支持特定的CSS功能
  • 【蓝桥杯选拔赛真题77】python计算小球 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析
  • 时间服务器 NTP协议
  • C++位操作实战:掩码、提取与组装
  • 073_基于springboot+Android的“川味游”app的设计与开发
  • c++学习DAY2
  • Java基于数据库的分布式可重入锁(带等待时间和过期时间)
  • 【Linux】进程调度 | 进程切换上下文数据
  • Genmo 的 Mochi1 AI 视频生成技术:内容创作的新纪元
  • 【C++干货篇】——C/C++内存管理
  • C++【string类的使用】(上)
  • 数据挖掘示例
  • 基于Java的就业信息管理系统源码带本地搭建教程
  • windows|常见的文件伪装方法
  • 如何使用 Maven 不同环境使用不同资源文件 提升项目安全性
  • vue通过JSON文件生成WPML文件源码
  • 【1024】程序员未来的路在那里
  • kafka 如何减少数据丢失?
  • Bash 中的 ${} 和 $() 有什么区别 ?
  • 最基础Lua语法教程,一看就会!(下篇)
  • 车辆自燃后除了找保险公司赔偿,还能以产品质量缺陷为由起诉厂家吗?