Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基于堆栈的和基于堆的溢出

基于堆栈的和基于堆的溢出
EN

Software Engineering用户
提问于 2016-02-09 12:55:56
回答 1查看 1.6K关注 0票数 -3

为什么执行基于堆的缓冲区溢出比基于堆栈的缓冲区溢出更困难?(关于x86体系结构)

我认为这可能是堆动态分配内存的事实。但还有比这个更重要的吗?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2016-02-09 13:59:45

它们共享相同的物理内存,但是堆栈帧包含返回地址。

返回地址将代码的地址存储在调用函数/过程/方法中,以便被调用的函数/过程/方法知道完成时返回到哪里。机械地,“返回”语句向处理器发出指令,从堆栈帧加载返回地址,然后卸载堆栈帧并跳转到加载的返回地址。(调用操作有效地进行了反向操作:捕获当前地址作为返回地址,并将其与新帧一起推到堆栈上。)

一个有问题的安全问题是劫持处理器程序计数器,它告诉它下一步将执行什么指令!

如果您在堆栈框架中覆盖返回地址,则可以将“返回”代码分支设置为您选择的位置,而不是它应该去的位置(返回到调用方)。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/309710

复制
相关文章
Java中的堆栈和堆内存
Java数据类型在执行期间存储在两种不同形式的内存中:堆栈和堆。它们通常由运行Java虚拟机(JVM)的底层平台维护。小面从Java软件开发的角度对这两种内存类型提供了一些见解。
灬沙师弟
2023/03/07
1.2K0
Java中的堆栈和堆内存
如何构造jvm的堆溢出和栈溢出
首先,我们知道Java堆内存存放的是对象实例。所以原理上只要我们不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清楚这些对象,也就是说当Eden区满的时候,GC被触发时,让GC误以为内存中的对象还存活着,那么在对象数量达到最大堆容量限制的时候就会产生内存溢出的异常。
earthchen
2020/09/24
1.4K0
js堆栈溢出的问题
    js是最令程序员头疼的问题了,不是语法也不是使用头疼,而是调试头疼,虽然有很方便的各种各样的调试工具,但经管这样有时候一个疏忽的小问题,会导致各种各样的奇怪问题的出现,今天笔者的同事就出现了这样的问题,苦闷了整整一天才找到了真正的问题。     出现js堆栈溢出的问题一般的情况有两种:       1.检查自己的js代码看代码中有没有死循环。     2.代码中引用了jQuery-1.4.2.min.js这个js实现一些动态效果或者是辅助,这个版本的jQuery就存在这样的问题(同事就是遇到了这个问
磊哥
2018/04/26
1.8K0
基于堆的优先队列
package com.snail.basic; public class MaxPQ<Key extends Comparable<Key>> { private Key[] pq; private int N; public MaxPQ(int Max){ pq = (Key[])new Comparable[Max]; } // 判断是否为空 public boolean isEmpty(){ return N==0;
用户2436820
2019/01/02
4310
堆栈溢出排查
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/d5000/eas/easDmSync/heapdump.hprof
全栈程序员站长
2022/11/15
1K0
堆栈溢出排查
无限递归引发的堆栈溢出
使用gdb进行调试后,定位到错误。当程序执行 return 1 + my_strlen(p++)这条语句时,会出现以下的段错误情况。
lexingsen
2022/02/24
7400
无限递归引发的堆栈溢出
CVE-2021-3156:Sudo中基于堆的缓冲区溢出 (Baron Samedit)
CVE-2021-3156:Sudo中基于堆的缓冲区溢出 (Baron Samedit)
Khan安全团队
2021/02/12
8930
CVE-2021-3156:Sudo中基于堆的缓冲区溢出 (Baron Samedit)
一个简单的基于 x86_64 堆栈的缓冲区溢出利用 gdb
C 缓冲区溢出背后的基本思想非常简单。您有一个缓冲区,这是一块保留用于存储数据的内存。在堆栈的外部(在 x86 和 x86_64 上向下增长,这意味着随着内存地址变大,内存地址会下降),程序的其他部分被存储和操作。通常,我们进行黑客攻击的想法是按照我们认为合适的方式重定向程序流。对我们来说幸运的是,对堆栈的操作(堆栈“粉碎”)可以让我们做到这一点。通常,您会希望获得特权,通常是通过执行 shellcode - 或者无论您的最终目标是什么,但出于本教程的目的,我们只会将程序流重定向到我们无法访问的代码(在实践,这几乎可以是任何事情;甚至包括执行未正式存在的指令)。这是通过写入越过缓冲区的末尾并任意覆盖堆栈来完成的。
Khan安全团队
2022/01/05
1.1K0
基于堆的优先级队列
优先队列由一个基于堆的完全二叉树表示,存储于数组pq[1..N]中,pq[0]没有使用。在insert()中,我们将N加一并把新元素添加在数组最后,然后用swim()恢复堆的有序性(当一颗二叉树的结点都大于等于它的两个子节点时,它被称为堆有序)。在delete()中,我们从pq[1]中得到需要返回的元素,然后将pq[N]移动到pq[1],将N减一,并用sink()恢复堆有序。同时我们还将不再使用的p[N]设置为null,以便系统回收它所占用的空间。
砖业洋__
2023/05/06
2130
基于数组越界的缓冲区溢出
上一篇文章说了函数调用时候的堆栈变化,这里就基于这个内容来验证一下基于数组越界的缓冲区溢出。
信安本原
2020/03/08
1.2K0
堆溢出与栈溢出:概念、原因和防范措施
在计算机安全领域中,堆溢出和栈溢出是两种常见的安全漏洞,它们都涉及到内存管理问题。本文将深入探讨这两种溢出的概念、原因以及防范措施,以便更好地理解它们的差异。
用户8909609
2024/02/03
2.1K0
基于开源项目搭建属于自己的技术堆栈
在技术面试的时候肯定都会问到使用了哪些第三方框架,为什么使用它而不用其他的。身边朋友就有这样的亲身经历: 面试官:你们项目中加载图片都是用的什么框架? 面试者:Glide 啊(内心窃喜) 面试官:为什
非著名程序员
2018/02/09
1.9K0
基于开源项目搭建属于自己的技术堆栈
Java堆栈溢出漏洞分析
什么是堆栈?在思考如何找堆栈溢出漏洞之前,先来弄懂什么是堆栈。Java的数据类型在执行过程中存储在两种不同形式的内存中:栈(stack)和堆(deap),由运行Java虚拟机(JVM)的底层平台维护。
FB客服
2023/02/09
1.6K0
Java堆栈溢出漏洞分析
【编程入门】C语言堆栈入门——堆和栈的区别
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助。 数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈
程序员互动联盟
2018/03/13
2.2K0
堆溢出 —— unlink | PWN
前几天,我们发了一篇 Ubuntu 16.04 配置 pwn 环境的文章,遭到了部分朋友的反感,他们认为我们不应该写这么基础的东西,甚至有几个朋友怒而取关了 其实那篇文章就是为了这个视频来做铺垫的,免
意大利的猫
2022/08/31
9690
堆溢出 —— unlink | PWN
学pwn 经典堆栈的缓冲区溢出
$gcc -g -Wall hello.c -o hello $g++ -g -Wall hello.cpp -o hello
用户5878089
2019/07/25
8110
异常、堆内存溢出、OOM的几种情况
【情况一】:   java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环;   如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决:   < jvm-arg>-Xms3062m < / jvm-arg>   < jvm-arg>-Xmx3062m < / jvm-arg> 【情况二】   java.lang.OutOfMemoryError: GC overhead limit exceeded   【解释】:JDK6新增错误类型,当GC为释放很小空间占用大量时间时抛出;一般是因为堆太小,导致异常的原因,没有足够的内存。   【解决方案】:   1、查看系统是否有使用大内存的代码或死循环;   2、通过添加JVM配置,来限制使用内存:   < jvm-arg>-XX:-UseGCOverheadLimit< /jvm-arg> 【情况三】:   java.lang.OutOfMemoryError: PermGen space:这种是P区内存不够,可通过调整JVM的配置:   < jvm-arg>-XX:MaxPermSize=128m< /jvm-arg>   < jvm-arg>-XXermSize=128m< /jvm-arg>   【注】:   JVM的Perm区主要用于存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space,这个区域成为年老代,GC在主程序运行期间不会对年老区进行清理,默认是64M大小,当程序需要加载的对象比较多时,超过64M就会报这部分内存溢出了,需要加大内存分配,一般128m足够。 【情况四】:   java.lang.OutOfMemoryError: Direct buffer memory   调整-XX:MaxDirectMemorySize= 参数,如添加JVM配置:   < jvm-arg>-XX:MaxDirectMemorySize=128m< /jvm-arg> 【情况五】:   java.lang.OutOfMemoryError: unable to create new native thread   【原因】:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。   【解决】:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS /MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:   1.通过 -Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);   2.通过-Xms -Xmx 两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。 【情况六】:   java.lang.StackOverflowError   【原因】:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。   【解决】:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。
BUG弄潮儿
2022/06/30
9040
异常、堆内存溢出、OOM的几种情况
异常、堆内存溢出、OOM的几种情况
【情况一】:    java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环;    如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决:    < jvm-arg>-Xms3062m < / jvm-arg>    < jvm-arg>-Xmx3062m < / jvm-arg>  【情况二】    java.lang.OutOfMemoryError: GC overhead limit exceeded    【解释】:JDK6新增错误类型,当GC为释放很小空间占用大量时间时抛出;一般是因为堆太小,导致异常的原因,没有足够的内存。    【解决方案】:    1、查看系统是否有使用大内存的代码或死循环;    2、通过添加JVM配置,来限制使用内存:    < jvm-arg>-XX:-UseGCOverheadLimit< /jvm-arg>  【情况三】:    java.lang.OutOfMemoryError: PermGen space:这种是P区内存不够,可通过调整JVM的配置:    < jvm-arg>-XX:MaxPermSize=128m< /jvm-arg>    < jvm-arg>-XXermSize=128m< /jvm-arg>    【注】:    JVM的Perm区主要用于存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space,这个区域成为年老代,GC在主程序运行期间不会对年老区进行清理,默认是64M大小,当程序需要加载的对象比较多时,超过64M就会报这部分内存溢出了,需要加大内存分配,一般128m足够。  【情况四】:    java.lang.OutOfMemoryError: Direct buffer memory    调整-XX:MaxDirectMemorySize= 参数,如添加JVM配置:    < jvm-arg>-XX:MaxDirectMemorySize=128m< /jvm-arg>  【情况五】:    java.lang.OutOfMemoryError: unable to create new native thread    【原因】:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。    【解决】:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS /MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:    1.通过 -Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);    2.通过-Xms -Xmx 两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。  【情况六】:    java.lang.StackOverflowError    【原因】:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。    【解决】:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。
业余草
2019/01/21
1.5K0
堆溢出,栈溢出的出现场景以及解决方案
堆溢出(Heap Overflow)和栈溢出(Stack Overflow)是两种常见的内存溢出问题,通常发生在内存管理不当或设计不合理的情况下。下面将详细探讨这两种溢出的出现场景以及可能的解决方案。
小马哥学JAVA
2024/07/04
2960
PHP基于堆栈实现的高级计算器功能示例
本文实例讲述了PHP基于堆栈实现的高级计算器功能。分享给大家供大家参考,具体如下: 当我们得到一个字符串运算式该如何去得出它的运算结果呢? 这时候我们就能使用堆栈的算法很巧妙的解决这个问题。 思路是这样的:(我们利用php函数substr循环去截取这个字符串运算式,依次取出这个字符串的值【我们得从第一个字符开始截取】,我们将开始截取位置设为一个循环增长的变量,初始化为【$index=0】),同时还需要创建两个栈,一个专门存放数字【$numStack】,一个存放运算符【$operStack】,我们还需要一个可以判断是否是运算符号的函数,将每次截取的值放入这个自定义函数中,返回一个可以区别为数字或运算符的标识,通过对这个标识的判断确定值是数字还是运算符,是数字就插入数栈,是运算符的话就插入符号栈。插入数栈的话可直接插入,但是符号栈的话需要特殊处理一下[【如果符号栈为空则直接插入,不为空:我们要将插入的符号与栈内的符号进行运算优先级比较(可以定义一个函数来判定符号优先级,把 *  和 / 假定为1  把 + 和 - 假定为0  假设数字大的优先级高,如此就能得出运算符优先级),当待插入的符号优先级小于等于栈内顶端的运算符优先级,就从数栈弹出两个值  符号栈弹出一个运算符 将它们进行运算】 下面是一个php的实例【参考自韩顺平老师的php算法教程】
用户2323866
2021/07/07
5550

相似问题

Java中的堆栈和堆内存

50

堆栈和堆-动态分配问题

30

基于Cookie的vs基于会话的与基于令牌的和基于声明的身份验证

20

如何设计基于堆栈的机器指令集?

20

使用GDB和C++分析堆栈和堆

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文