栈溢出原理与实践

0x1 基础知识

CPU:寄存器

内存:物理内存地址、虚拟内存地址

栈:可以看做一种数据结构,先进后出的数据表。有压栈(PUSH)、有弹栈(POP)、标识栈的属性有两个:栈顶(TOP)、栈底(BASE)

可以把栈看做一副扑克,PUSH,往上放一张牌(压入数据),POP,拿走一张牌(弹出数据)。

0x2 函数调用在内存中的栈中发生了什么?

编译后的代码在内存中分布是散乱的,当CPU执行到myfun()函数时,会从代码区域跳进myfun函数中执行里面的机器指令区域(我们写的函数中的代码),在那里取值并执行;当myfun()函数执行完毕,函数的末尾往往

有返回,将返回到myfun()函数外后面的一句代码继续执行。

问题?

CPU如何知道去myfun()函数中取值,执行完myfun()函数后又是如何知道返回到main函数的呢?

CPU是从那里获取这些函数调用和返回的信息呢?答案:栈。

当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,然后把它压入栈中,这个栈帧中的内存空间地址被它所属函数独享的,正常情况下不会和别的函数共享的。当函数返回时,系统栈会弹出该函数所对应的栈帧。

函数调用过程

  • 调用myfun()函数时,系统栈为配合myfun()函数执行,会在系统栈中为其开辟新的栈帧并压入。 下列图为 栈中的操作。
myfun()                                               ↓   PUSH 压栈   先进后出  
局部变量a                                            ↓  扑克牌,最先压栈的是myfun2()的返回地址
局部变量b                                            ↓
返回地址
myfun2()
局部变量a
局部变量b
返回地址                                   
                                                                ↑ POP 弹栈时 先弹myfun()  后进先出 

当myfun()函数返回时,myfun()的栈帧将被弹出系统栈。

寄存器与函数栈帧

每一个函数独占自己栈帧空间,当前正在运行的函数栈帧总是在栈顶。Win32系统提供两个特殊的寄存器来标识。

ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。

EBP:基址指针寄存器(extended base pointer),其内存存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

EIP:指令寄存器(extended instruction pointer),存放一个指针,该指针永远指向下一条等待执行的指令地址。

注意:

"栈帧底部" 和 "栈底"是两个概念,栈底是指 ”系统栈底“ ,而栈帧底部指函数栈帧的底部。而栈帧顶部和系统栈的顶部是同一个位置。ESP和EBP之间的内存空间为当前栈帧。

待修改。。。。。

时间: 2024-10-14 11:09:20

栈溢出原理与实践的相关文章

分布式开放消息系统(RocketMQ)的原理与实践

分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一款高性能.高吞吐量的消息中间件,它是怎样来解决这两个问题的?RocketMQ 有哪些关键特性?其实现原理是怎样的? 关键特性以及其实现原理 一.顺序消息 消息有序指的是可以按照消息的发送顺序来消费.例如:一笔订单产生了 3 条消息,分别是订单创建.订单付款.订单完成.消费时,要按照顺序依次消费才有意

Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析方法2 递归下降是现阶段主流的语法分析方法,2 于是我们可以把上面的语法改写成如下形式: 1)       Operator="+" | "-" | "*" | "/" 2)       Expression=<数字>

《从PAXOS到ZOOKEEPER分布式一致性原理与实践》pdf

下载地址:网盘下载 内容简介  · · · · · · <Paxos到Zookeeper:分布式一致性原理与实践>从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议.同时,本书深入介绍了分布式一致性问题的工业解决方案--ZooKeeper,并着重向读者展示这一分布式协调框架的使用方法.内部实现及运维技巧,旨在帮助读者全面了解ZooKeeper,并更好地使用和运维ZooKeeper.全书共8章,分为五部分:第一

嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析

/***********************************************************************************************************                                                uC/OS-II*                                          The Real-Time Kernel  RTOS* ***************

《数字图像处理原理与实践(MATLAB版)》一书之代码Part9

本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part9,辑录该书第431至第438页之代码,供有需要读者下载研究使用.至此全书代码发布已经接近尾声,希望这些源码能够对有需要的读者有所帮助.代码执行结果请参见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MATLAB版)>一书代码发布的说明 http://blog.csdn.net/baimafujinji/article/details/40987807 首先给出的是原书P438所列之程序源

《数字图像处理原理与实践(MATLAB版)》一书之代码Part8

本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part8,辑录该书第375至第415页之代码,供有需要读者下载研究使用.至此全书代码发布已经接近尾声,希望这些源码能够对有需要的读者有所帮助.代码执行结果请参见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MATLAB版)>一书代码发布的说明 http://blog.csdn.net/baimafujinji/article/details/40987807 P385-1 function y

20145309《网络对抗技术》免杀原理与实践

20145309<网络对抗技术>免杀原理与实践 1.基础问题回答 (1)杀软是如何检测出恶意代码的? 根据特征来检测:对已存在的流行代码特征的提取与比对根据行为来检测:是否有更改注册表行为.是否有设置自启动.是否有修改权限等等 (2)免杀是做什么? 使用一些方法使得恶意程序不被杀软和防火墙发现,避免被查杀. (3)免杀的基本方法有哪些? 加壳:就是相当于把你的后门代码封装起来,但是现在大部分公开的壳都能被杀毒软件查出来,所以加这些壳还不如不加:加花指令:就是加一段垃圾代码,但是并不影响程序的正

20145331魏澍琛《网络对抗》——免杀原理与实践

20145331魏澍琛<网络对抗>--免杀原理与实践 问题回答 1.杀软是如何检测出恶意代码的? 一个是基于特征码的检测,第二个是启发式恶意软件检测,最后是基于行为的恶意软件检测 2.免杀是做什么? 让病毒不被杀毒软件kill掉 3.免杀的基本方法有哪些? a)可以用这次实验所涉及的改变特征码 b)加壳:就是相当于把你的后门代码封装起来,但是现在大部分公开的壳都能被杀毒软件查出来,效果其实不好 实践过程 一.使用msf生成后门程序的检测 1.用上节课所讲的msf生成一个后门 2.到相应网站上查

20145239杜文超《网络对抗》- 免杀原理与实践

<网络对抗>- 免杀原理与实践 基础问题回答 (1)杀软是如何检测出恶意代码的? 根据搜集来的最全的.最新的特征码库,检测程序有没有异常或者可疑的行为. (2)免杀是做什么? 利用一些手段,让你的的后门不被AV软件发现. (3)免杀的基本方法有哪些? 加壳.用其他语言进行重写再编译. 使用反弹式连接. 自己手工编一个. 实践总结与体会 这次的免杀实验做得非常顺利,每一个步骤基本上都一次成功,虽然这正是我所希望的但也有不好就是万一下次遇到问题可能不会解决,毕竟遇到问题.解决问题的过程才能让学习的