首页
学习
活动
专区
工具
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(1L8); /*256 B*/ phuge3 = malloc(1L为什么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 8(rsp),edx放到edx; 然后计算 addb dl,(rax);用这个取值的符号计算; 当时栈的分配,因为a4其实就是一个字节的char,他会放到申请的八个字节的栈帧的最后一个字节上...**-----------**(210)6**乘以16--------------**1018乘以16 内存的限制 现在64位机器只用47位地址-------也就是差不多256TB的地址 这就是为什么会出现这个地址

    25320

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

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

    94411

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

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

    15810

    二进制基础

    栈空间(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

    36840

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

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

    86801

    CC++:堆栈面面观

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

    54720

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

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

    1.3K30
    领券