首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么malloc会覆盖RSP和RSP + 8?

在计算机内存中,malloc 是一个用于动态分配内存的函数。当程序需要在运行时分配内存时,它会调用 malloc 函数来请求所需的内存空间。malloc 函数会从堆内存中分配所需的空间,并返回一个指向该空间的指针。

RSPRSP + 8 是寄存器,用于存储特定的数据。RSP 是栈指针寄存器,它指向当前栈的顶部。RSP + 8 是栈指针寄存器的下一个位置,用于存储下一个数据。

当程序调用 malloc 函数时,它会将请求的内存大小作为参数传递给该函数。malloc 函数会根据请求的内存大小从堆内存中分配空间,并返回一个指向该空间的指针。然后,程序会将该指针存储在 RSPRSP + 8 寄存器中,以便在后续操作中使用。

因此,当程序调用 malloc 函数时,它会将分配的内存空间的指针存储在 RSPRSP + 8 寄存器中。这就是为什么 malloc 会覆盖 RSPRSP + 8 的原因。

总之,malloc 函数会从堆内存中分配所需的空间,并将分配的内存空间的指针存储在 RSPRSP + 8 寄存器中。这就是为什么 malloc 会覆盖 RSPRSP + 8 的原因。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

面试官不讲武德,居然让我讲讲蠕虫和金丝雀!

缓冲区溢出   缓冲区溢出是指计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序检查数据长度,而且并不允许输入超过缓冲区长度的字符。...(1L<<28); /*256 MB*/ psmall2 = malloc(1L<<8); /*256 B*/ phuge3 = malloc(1L<<32); /*4 GB*...为什么fun(2)fun(3)的值接近3.14,而fun(6)会报错呢?   要搞清楚这个问题,我们要明白结构体在内存中是如何存储的,具体如下图所示。 ?...这就是为什么我们打印出来的fun(2)fun(3)的值如此接近3.14的原因。   当输入 6 时,就修改了对应的这块内存的值。...将金丝雀值存放在一个特殊的段中,标记为只读,这样攻击者就不能覆盖存储金丝雀值。在恢复寄存器状态返回前,函数将存储在栈位置处的值与金丝雀值做比较(通过第10行的xorq指令)。

1.2K10

【详细分析CC++程序运行过程】狂肝120小时,带你速览CSAPP

函数调用数据传送示例 解析 栈上的局部存储 x86-64实际内存的分配 实际分配图像 内存的限制 栈-存放 局部变量 文本段-存放exe二进制代码的区域 数据段-存放全局变量,静态变量,字符串常量 堆-存放malloc...了; P调用Q时,P的代码首先把参数复制到合适寄存器; P的代码可访问Q返回在rax中的返回值; 存6个的参数在栈中,我们把第7个参数放在rsp+8中,第八个参数在rsp+16; 举例把第七个char...a4放到%rsp+8,第八个char* a4放到%rsp+16定义为*a4p ; *a4p+=a4-----------翻译成:先把a4的指针放到rax,movq 16(rsp),rax; 然后获得a4...的值movl 8rsp),edx放到edx; 然后计算 addb dl,(rax);用这个取值的符号计算; 当时栈的分配,因为a4其实就是一个字节的char,他放到申请的八个字节的栈帧的最后一个字节上...**-----------**(210)6**乘以16--------------**1018乘以16 内存的限制 现在64位机器只用47位地址-------也就是差不多256TB的地址 这就是为什么会出现这个地址

22620

【C++】拿下! C++中的内存管理

产生内存碎片(如果不停开辟空间导致内存浪费)且效率较慢。 数据段—储存全局数据和静态数据。 代码段—可执行的代码 / 只读常量。...+8],rcx 00007FF7C6A17D65 sub rsp,38h for (;;) { if (void* const block =...,new[]delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc返回NULL,需要我们来判断异常 5.2 自定义类型 new的原理 调用 operator new 函数申请空间...注意 开辟空间多开一些来储存个数N。...不同的地方是: mallocfree是函数,newdelete是操作符 malloc申请的空间不会初始化,new可以初始化 malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可

13410

虚拟内存探究 -- 第五篇:The Stack, registers and assembly code

400531: 48 83 ec 10 sub rsp,0x10 前两行操作了寄存器rbprsp。...所以,本指令达到了两个目的: 局部变量占用的内存空间被释放 栈、寄存器rbprsp均恢复成调用main函数前的状态 ? ?...五、对栈的进一步探究 1、局部变量为什么要初始化 当栈上的局部变量被释放的时候,他们并未被完全清理。他们所占内存区域,填充的仍然是原来的数值,而这一区域在接下来可能被其他函数用到。...前面解释过,该指令导致栈帧收缩,如下图所示: ? 当我们调用函数func2时,它的栈帧如下图所示,局部变量的值就是当前栈上残留的值。这就是func2中变量a、b、c的值func1一致的原因了。...拥有相同的rbprsp值(它们的栈帧是相同的) 从func1的汇编代码sub rsp,0x10可以看出,寄存器rbprsp的差值是0x10 在main函数中rbprsp的值相同,因为main无局部变量

86011

二进制基础

栈空间(Stack):动态存储区, 控制程序流 Memory Mapping Region:映射一个虚拟空间(glic) 堆空间(heap):动态存储区, 满足用户动态内存申请(malloc...) data段:静态存储区 code段:静态存储区 堆空间从低地址向高地址增长 栈空间从高地址向低地址增长 段节: ·代码段包含了代码只读数据 .test节(...·栈段 ·一个段包含多个节(意思是从磁盘到内存,一个段变为多个节) ·段视图用于进程的内存区域的rwx权限划分 ·节视图用于ELF文件 编译链接时 与 在磁盘上存储时 的文件结构的组织 程序的装载与进程的执行...sum(int x, int y) { int t = x + y; } int main { sum(1, 2); (调用函数消耗的内存空间在栈中) void* ptr = malloc..., 然后RSP减一个字节 例如: pop 目的地址 分解为: mov (%rsp) 目的地址 add 长度 %rsp ·CMP

34640

消失的调用栈帧-基于fp的栈回溯原理解析

在函数调用过程中,栈指针被用于跟踪函数调用栈的状态,以便正确地分配释放栈空间。压栈的时候自动减少一定字节,例如32位机器减少4字节。...接着,foo函数会去调用bar,bar函数的汇编如下图所示:也是foo的调用一致,先将RBP压栈并设置RBP = RSP,此时的调用栈情况:那么,我们怎么去进行栈回溯呢?...push %rbp的操作,结合我们前文所说,从这里进行栈回溯的时候就自然而然的不能找到bar函数了,如图所示:这里我们假设该函数为malloc。...那么为什么这里没有做压栈操作呢?...这是因为push %rbpmov %rsp,%rbp是实实在在写在汇编代码中的,如果每次调用都执行的话带来性能损耗,也即通过**frame pointer**方式获取调用栈多执行指令,带来一定的性能损耗

57001

CC++:堆栈面面观

(在说这句话的时候,要明确的一点就是这是指的x86系统,并非所有架构的系统都如此) 之所以它们呈现出相反的两种地址增长方式是有其历史原因的: 早期的机器上内存的大小十分有限,如果堆栈使用相同的地址增长方式...推荐一篇文章《X86-64寄存器栈帧》 说个题外话,上面我的代码如果开了优化怎么样呢?用gcc -S -masm=intel -O 来编译一下看看。...eax, 0 call __printf_chk add rsp, 8 ret 哈哈。...C语言中的malloc,C++中的new完成的都是堆上的操作。堆不会自动释放所以需要freedelete。 还记得经典面试题吗:比较一下mallocnew的不同。...关于动态内存的分配策略其实大家的“操作系统”课上都有学过,只不过通常大家很难直接malloc/new联系起来。

46720

go语言调度器源代码情景分析之七:函数调用过程

在汇编指令一节我们介绍过,执行push指令修改rsp寄存器的值,但它并不会修改rip寄存器,为什么这里rip也变了呢?...进制的0x20),使其指向了栈空间中一个更低的位置,这一步看似只是简单的修改了rsp寄存器的值,其实质却是给main函数的局部变量临时变量预留了32(0x20)字节的栈空间,为什么说是预留而不是分配,...sum函数传递参数,为了不覆盖argcargv,所以这里需要先把这两个参数保存在栈里面,然后再把传递给sum函数的两个参数12放入这两个寄存器之中。...main函数之所以需要调整rsp寄存器的值是因为它需要使用call指令来调用sum函数,而call指令自动把rsp寄存器的值减去8然后把函数的返回地址保存到rsp所指的栈内存位置,如果main函数不调整...rsp的值,则call指令保存函数返回地址时会覆盖局部变量或临时变量的值;而sum函数中没有任何指令自动使用rsp寄存器来保存数据到栈上,所以不需要调整rsp寄存器。

1.2K30

汇编

您可以通过选择不同的帧并在 LLDB 控制台中键入 cpx rbp 或 cpx rsp 在 LLDB 中对此进行验证。 那么,为什么这两个寄存器很重要?...rdx = 0x0040000000000000 在本节中,dumpreg 的输出将覆盖在每个汇编指令上,以准确显示每个指令期间每个寄存器发生的情况。.../gx 表示以十六进制格式将内存格式化为一个巨大的字(8 个字节,还记得第 11 章 “汇编内存” 中的术语吗?)。...再次输入 si dumpreg: 堆栈的顶部 pop 到 RDX 中,您知道最近将其设置为 0x5。 RSP 递增 0x8。...第二行说 “将 0x8 放入 RSP 所指向的内存地址加 0x8。” 等等。 这会将值放入堆栈。但是请注意,没有使用 push 指令显式推送这些值,这会减少 RSP 寄存器。这是为什么

3.3K20

当谈论协程时,我们在谈论什么

在本文中,我将试着去回答以下四个问题: Q1 (Why): 为什么需要协程? 我们一起回顾协程出现的历史背景,当时要解决什么问题;同时,现在是什么场景,需要使用协程来进行处理?...为什么这里我们没有感觉到 rsp 呢?是因为这里栈是连续的,push pop 操作,将信息保存到栈中或弹出栈中数据时,会同步修改栈顶指针 rsp。...在进入 hello 时,之前一样保存好 main 的 rbp,因此我们不需要额外关注链式结构。 我们只需要手动维护 rsp 就可以了。...用一段伪 (汇编) 代码描述一下,将 malloc 分配的内存,其高地址设置到 rsp 中,将参数设置到 rdi 中,call hello 进行调用。...在内存管理方面,直接使用 malloc free 进行内存的分配释放,配合 co_wait 函数标识定义全局析构函数,实现自动的内存回收。

1.1K50

x64汇编第三讲,64位调用约定与函数传参.

前4个参数分别是 rcx rdx r8 r9进行传参.多余的通过栈传参.从右向左入栈. 2.申请参数预留空间 在x64下,在调用一个函数的时候,申请一个参数预留空间.用来保存我们的参数.比如以前我们通过...//函数内部 mov [rsp - 8],rcx mov [rsp - 0x10],rdx mov [rsp - 0x18],r8 mov [rsp - 0x20]...通过上面来说.我们应该申请 sub rsp,0x20个字节才对.在CALL的时候 x86 x64都是一样的会将返回地址入栈. 那为什么rsp,0x28.这样的话多申请一个参数的值哪....那么还有人会说.按照16字节对齐,那么我们的参数已经是16字节对齐了.比如为我们4个寄存器申请预留空间. rsp,0x20. (4 * 8 = 32 = 16j进制的 0x20) 那为什么还是申请 rsp...其实是这样的.当我们在 Call函数的时候.返回地址入栈.如果按照我们之前申请的rsp,0x20个字节的话.那么当 返回地址入栈之后,现在总共抬栈大小是 0x28个字节.并不是16进制对齐.

3.4K20
领券