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

GNU汇编程序-为什么-4(%rbp)不覆盖堆栈上的帧指针?

GNU汇编程序中的"4(%rbp)"是一种寻址方式,用于访问位于堆栈上的相对位置的数据。在这种寻址方式中,"%rbp"是帧指针寄存器,"4"是相对于帧指针的偏移量。

为什么"4(%rbp)"不会覆盖堆栈上的帧指针呢?这是因为帧指针是用来指示当前函数的堆栈帧的位置的重要指针,它指向当前函数的栈帧底部。栈帧包含了函数的局部变量、参数和其他相关信息。

在函数执行过程中,帧指针的值是固定的,不会随着局部变量的创建和销毁而改变。因此,通过使用帧指针来访问堆栈上的数据,可以确保不会覆盖帧指针的值。

"4(%rbp)"表示相对于帧指针的偏移量为4的位置,这个位置通常用于访问函数的参数或局部变量。通过使用这种寻址方式,可以方便地访问堆栈上的数据,而不会影响帧指针的值。

总结起来,"4(%rbp)"不会覆盖堆栈上的帧指针,是因为帧指针是固定的,通过使用帧指针来访问堆栈上的数据可以确保不会改变帧指针的值。这种寻址方式在访问函数的参数和局部变量时非常常见。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(移动推送、移动分析、移动测试等):https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云虚拟专用网络(VPC):https://cloud.tencent.com/product/vpc
  • 腾讯云安全产品(DDoS防护、Web应用防火墙等):https://cloud.tencent.com/product/safety
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

通过反汇编理解函数调用机制(x86和ARM)

在分析上面的汇编程序之前,需要了解rbp、rsp为栈基址寄存器、栈顶寄存器,分别指向栈底和栈顶;edx、eax、esi、edi均为x86CPU通用寄存器,可以存放数据(虽然它们还有别的作用,但是本文章涉及...对上面汇编代码分析: 进入main函数,保护现场,将rbp压入堆栈; 然后为main函数开拓新堆栈框架,rbp与当前rsp相同,rsp再向上扩充16个字节(0x10);(以前C程序只能在函数前面声明变量...; 再次将mainrbp压栈,保护; 新rbp与当前rsp相同,把通用寄存器中数据赋给栈底上方偏移地址为4和8单元(此为函数参数传递关键); 将传入新栈参数赋给通用寄存器,进行加法操作,结果存入...eax; pop出rbp,回到main函数; 将eax中运算结果赋给栈底上方偏移地址为4单元; 然后调用printf函数显示结果。...这段代码解析与x86类似,只不过需要了解几个arm汇编指令和寄存器名称。fp为寄存器,起“标签”作用。

2K20

汇编和栈

在上图中,堆栈指针顺序如下: 栈指针当前指向第 3 。 指令指针寄存器指向代码调用一个新函数。...堆栈指针将更新为指向 Frame 4,该 feame 可能负责指令指针中此新调用函数中暂存空间和数据。 函数具体执行在第 4 中完成,执行完之后指针从第四弹出,并继续指向第三....当一个函数序言完成设置时,RBP 内容将指向堆栈下面的前一个 RBP 注意:当您通过单击 Xcode 中或使用 LLDB 跳到另一个堆栈时,RBP 和 RSP 寄存器都将更改值以对应于新!...您可以通过选择不同并在 LLDB 控制台中键入 cpx rbp 或 cpx rsp 在 LLDB 中对此进行验证。 那么,为什么这两个寄存器很重要?...rdx = 0x0040000000000000 在本节中,dumpreg 输出将覆盖在每个汇编指令,以准确显示每个指令期间每个寄存器发生情况。

3.5K20
  • 浅谈函数调用!

    (一)一个简单汇编例子 上面讲有些空洞,来看一个实际例子: ; 将寄存器rsp值存储到寄存器rbp中mov rbp, rsp ; 将四个字节4存储到地址为rbp-4mov...%esp,%ebp总被分别用着指向当前栈顶部和底部,主要用于在当前函数推出时,将他们还原为原始值;往往会在栈开始处保存上一个栈ebp,而esp是全栈栈顶指针,一直指向栈顶部。...rsp是堆栈指针寄存器,通常会指向栈顶位置,堆栈pop和push操作就是通过改变rsp值即移动堆栈指针位置来实现rbp是栈指针,用于标识当前栈起始位置。...保存返回地址和保存一栈%rbp都是为了函数返回时,恢复父函数结构(保存函数调用上下文)。...所以传递数据时候,要知道传递数据大小: Intel格式汇编会在数据前面说明数据大小:比如 mov DWORD PTR [rbp-4],4,意思是将一个4字节4存储到栈(地址为rbp-4)。

    1.7K10

    程序机器级表示

    编译阶段:编译器ccl将预处理后文件翻译成.s结尾文本文件,里面包含一个汇编程序。...其中push指令相当于这两条指令subq $8 %rsp,mov %rbp %rsp; 算数和逻辑运算 ?...x86-64过程实现包括特殊指令和一些对机器资源使用约束。 1.3.1运行时栈 当x86-64过程需要存储空间超出寄存器能够存放大小时,就会在栈分配空间(栈)。...下图给出了运行是栈通用结构,包括划分“栈”。当前正在执行过程总是在栈顶。(数据段、代码段、堆栈段、BBS段区别) ? ?...程序重置了%esx寄存器值,把栈指针加24,释放了栈。 寄存器局部存储空间 寄存器是唯一在所有过程中共享资源。

    64610

    X86函数调用模型分析

    A调用完B后还需要继续执行,继续执行位置需要保存起来。 ---- 下面分析x86具体实现。 (资料汇编) 速查: 对于栈来说:栈顶部用bp指针(高地址),栈底部(低地址)用sp指针。...ebp:指针,保存当前栈顶部地址(高地址)。 esp:堆栈指针,保存当前堆栈底部地址(低地址)。...image.png step11:从堆栈中删除参数 继续讲堆栈参数弹出到寄存器,然后删除esp栈顶以下元素。栈顶以下元素已经不在栈中,没有意义。...# 栈顶部入栈 0x0000000000401123 : 48 89 e5 mov %rsp,%rbp # 栈顶部指针rbp指向新栈顶部 4...# 顶位置 入栈 0x000000000040113d : 48 89 e5 mov %rsp,%rbp # rbp指针,指向新

    1.2K20

    谈谈iOS获取调用链

    调用约定指定他们其中一些寄存器有特殊用途,例如: r0-r3:用于存放传递给函数参数; r4-r11:用于存放函数本地参数; r11:通常用作桢指针fp(frame pointer寄存器),栈基址寄存器...在这个过程中用到了上面说寄存器,fp指针,它总是指向当前底部;sp栈指针,它总是指向当前顶部。这两个寄存器用来定位当前所有空间。...而从func代码可以看到,首先使用push rbp指针保存起来,而由于刚跳转到func函数,此时rbp其实是上一个栈指针,即它值其实还是上一个栈底部地址,所以此步骤其实是将上一个底部地址保存了下来...而栈顶部又正好是刚刚push进去存储上一个指针地址地址,所以rbp指向时当前栈底部,但其中保存值是上一个栈底部地址。...至此,也就解释了为什么fp指向地址存储内容是上一个栈fp地址,也解释了为什么fp向前一个地址就正好是lr。

    3.5K31

    X86如何实现函数调用?

    A调用完B后还需要继续执行,继续执行位置需要保存起来。 ---- 下面分析x86具体实现。 (资料汇编) 速查: 对于栈来说:栈顶部用bp指针(高地址),栈底部(低地址)用sp指针。...ebp:指针,保存当前栈顶部地址(高地址)。 esp:堆栈指针,保存当前堆栈底部地址(低地址)。...step10:弹出eip 继续使用esp弹出old eip值赋给eip。 step11:从堆栈中删除参数 继续讲堆栈参数弹出到寄存器,然后删除esp栈顶以下元素。...# 栈顶部入栈 0x0000000000401123 : 48 89 e5 mov %rsp,%rbp # 栈顶部指针rbp指向新栈顶部 4...# 顶位置 入栈 0x000000000040113d : 48 89 e5 mov %rsp,%rbp # rbp指针,指向新

    2.8K20

    CCPP函数调用原理 | 函数指针 | 堆栈隐患

    内存为什么堆栈 因为它存储方式是堆叠,水位线是指栈顶,它也是一个内存地址,保存才rsp寄存器里。...堆栈不仅能存放函数返回地址,还能存放参数、栈变量和其他数据,这也是每次函数调用都要存储恢复rbp寄存器原因 堆栈溢出例子:无穷递归 手动回溯函数调用轨迹: 从CPU视角认识函数指针 两个函数汇编指令完全相同...普通变量因为用法、字节长度不同需要定义不同变量类型,函数也例外,参数返回值不同也需要事先定义(typedef)相应类型函数指针,从而帮助主调函数正确给函数指针传递参数和获取返回值。...红色水位线是寄存器rsp值,用来表示栈顶内存地址,蓝色基准线是寄存器rbp 值,用来表示main函数基地址。...func() 把rbp寄存器值压入栈顶,栈顶水位线也随之升高,至此main函数保护工作完成。

    90310

    x64架构下Linux系统函数调用

    3.3 栈对齐问题 System V AMD64要求栈必须按照16字节对齐,就是说在通过call指令调用目标函数之前栈顶指针即rsp指针必须是16倍数。...subq $16, %rsp # 栈顶地址-16,栈扩容,这里没搞懂为什么要扩容,有懂同学欢迎评论区指点下 这三条指令是用来分配栈,执行完成后栈变成下方样子: 继续往下看: movabsq...开头仍然是建立栈指令,执行完成后,此时栈样子如下: 继续往下看: movq %rdi, -24(%rbp) movq %rsi, -32(%rbp) movq -32(%rbp...寄存器 movq %rax, -8(%rbp) movq -8(%rbp), %rax # 将返回值保存到rax寄存器 这里没搞懂为什么需要先挪到内存中再保存到rax寄存器,可能是编译器实现起来比较方便吧...,有懂同学欢迎评论区指点下 此时栈情况: foo函数最后执行了以下两条指令: popq %rbp # 将栈顶值pop出来保存到rbp寄存器,即修改栈基底地址为当前栈顶值,同时栈顶指针-8

    12610

    攻击本地主机漏洞(中)

    基于堆栈缓冲区溢出类似于前面的堆示例,因此,当程序向缓冲区写入数据超过堆栈分配处理量时,可能会导致覆盖现有堆栈数据,并在覆盖指令指针时导致拒绝服务或任意代码执行。...如果输入值大于其长度,它将覆盖金丝雀值,导致程序抛出分段错误(segfault),因为输入值内容试图覆盖内存受限区域。过去,Linux允许在堆栈执行指令。...RSP(堆栈指针)、RBP(基指针)和RIP(指令指针)是帮助促进程序执行重要寄存器。...基指针用于记住堆栈底部(即end)所在位置,指令指针保存CPU正在执行指令地址。对于缓冲区溢出,如果可以控制RBP,就可以控制RIP并获得对执行位置控制。...正如我在步骤4中提到,RSP和RBP很重要,因为我们需要使用这些位置来识别偏移量并执行恶意负载。

    1.4K20

    C语言 | C++ 基础栈溢出及保护机制

    该函数开头push rbp; mov rbp, rsp; sub rsp, 0x40,先保存rbp数值,再令rbp等于rsp,然后将栈顶指针rsp减小0x40(也就是64),相当于在栈分配长度为...再结合函数结尾leave; ret,同时类比一下32位汇编中函数栈布局,可以画出本程序中main函数布局如下(请注意下图是按栈顶在上、栈底在下方式画):                     ...rbp即函数指针,在main函数中,name数组保存在rbp-0x40~rbp+0x00之间,rbp+0x00处保存是上一个函数rbp数值,rbp+0x08处保存了main函数返回地址...当main函数执行完leave命令,执行到ret命令时:上一个函数rbp数值已重新取回至rbp寄存器,栈顶指针rsp已经指向了保存这个返回地址单元。...但是,如果用户输入了精心挑选字符后,覆盖在这里数值是一个合法地址呢?如果这个地址恰好保存了用户想要执行恶意指令呢?会发生什么事情?

    4.8K88

    Android 内核控制流完整性

    防止代码重用攻击 利用内核常用方法是使用错误来覆盖存储在内存中函数指针,例如存储了回调函数指针,或已被推送到堆栈返回地址。...虽然我们继续将 GNU 汇编程序用于独立汇编代码,但 LTO 要求我们切换到 LLVM 集成汇编程序以进行内联汇编,并将 GNU gold 或 LLVM 自己 lld 作为链接器。...如前一节所述,我们在 Pixel 3 启用 CFI 时遇到最常见问题是由函数指针类型匹配引起良性违规。...当内核遇到这种违规时,它会打印出一个运行时警告,其中包含失败时调用堆栈,以及未通过 CFI 检查目标调用。更改代码以使用正确函数指针类型可以解决问题。...虽然我们已经修复了 Android 内核中所有已知间接分支类型匹配问题,但在设备特定驱动程序中仍然可能发现类似的问题,例如。

    3.3K40

    一个简单基于 x86_64 堆栈缓冲区溢出利用 gdb

    堆栈外部(在 x86 和 x86_64 向下增长,这意味着随着内存地址变大,内存地址会下降),程序其他部分被存储和操作。通常,我们进行黑客攻击想法是按照我们认为合适方式重定向程序流。...这是通过写入越过缓冲区末尾并任意覆盖堆栈来完成。...随机键,您就会覆盖堆栈。除非仔细挑选输入数据,否则这通常只会导致崩溃,更常见是所谓分段错误。 [marshall@jerkon]{11:14 PM}: [~/Hack/bof_wt] $ ....下一部分需要一些反复试验,您需要弄清楚可以在缓冲区 u 末尾插入多少个 A(十六进制 0x41),直到完全覆盖 RIP 地址(返回指令指针)。...我们将要覆盖返回指针, 0x55555555519b以便跳过 p 条件。 您需要重新计算 A 数量作为要使用填充,通常是您使用数字 - 6。

    1.1K40

    【调试】GDB使用总结

    in print at gdb_example.c:4 显示栈 backtrace命令可以在遇到断点而暂停执行时显示栈。...add %al,(%rax) 显示反汇编 格式 disassemble disassemble 程序计数器 disassemble 开始地址 结束地址 格式1为反汇编当前整个函数,2为反汇编程序计数器所在函数整个函数...gcore 'pidof gdb_example' 该命令无需停止正在运行程序,可以直接从命令行直接生成转储文件。当需要在其他机器单独分析问题原因时,或者是分析客户现场问题时十分有用。...反复执行 ignore 断点编号 次数 在编号指定断点,监视点忽略指定次数 continue与ignore一样,也可以指定次数,达到指定次数前,执行到断点时暂停。...最后向大家推荐一个github.gdbinit文件:https://github.com/gdbinit/Gdbinit,把这个弄懂,相信gdb脚本文件就不在话下了。

    1.5K20

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

    指令sub rsp, 0x10在栈为局部变量开辟了存储空间,即从rbp所指地址到rsp所指地址内存区域(16个字节),足以存储int型变量a。这块内存空间被称为栈。...五、对栈进一步探究 1、局部变量为什么要初始化 当栈局部变量被释放时候,他们并未被完全清理。他们所占内存区域,填充仍然是原来数值,而这一区域在接下来可能被其他函数用到。...a位于rbp - 0xc所指内存区域 b位于rbp - 0x8所指内存区域 c位于rbp - 0x4所指内存区域 注意,这几个变量在栈排列顺序和代码中定义顺序并不一致。...前面解释过,该指令会导致栈收缩,如下图所示: ? 当我们调用函数func2时,它如下图所示,局部变量值就是当前栈残留值。这就是func2中变量a、b、c值和func1一致原因了。...所以,我们只需要将变量rsp转换为unsigned long int类型指针,并解析该指针指向内存区域值即可:*(unsigned long int *)rbp

    92111

    CC++ 学习笔记三(函数)

    完成这一步后,就完成了保留基地址,初始化本栈顶地址。 这里以我debug地址为例,此时rbp 值为 0x730,rsp值也为0x730 2....看到这里便有一个疑问,其实做一个传递立即数操作,为什么需要先传递到内存,再传递到寄存器用于函数调用呢?...(%rip), %rdi ; "result=%d\n" 6.子函数调用 将前一个堆栈栈基地址寄存器rbp入栈。...(%rbp), %eax 8 子程序跳出函数,跳转回到main函数 执行前堆栈 最后便是回到main函数步骤。...函数如无返回值时,显式声明void类型返回 听起来其实非常简单,日常编程中也不容易遗漏。这里提及一下C早期版本中,支持填返回值。且默认返回值为int。

    1.1K10

    C和汇编如何互相调用?嵌入式工程师必须掌握

    指针 R12 ip 指令指针 R13 sp 栈指针 R14 lr 连接寄存器 2、堆栈使用规则: ATPCS规定堆栈为FD类型,即满递减堆栈。...而对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足以下条件: 外部接口数据栈一定是8位对齐,也就是要保证在进入该汇编代码后,直到该汇编程序调用外部代码之间,数据栈指针变化为偶数个字;.... 1.参数个数可变子程序参数传递规则 对于参数个数可变子程序,当参数超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数....举例: 使用r0 接收返回值 int func1(int m, int n) m -- r0 n -- r1 返回值给 r0 「为什么有的编程规范要求自定义函数参数不要超过4个?」...;第5个参数通过堆栈传递 ADD R3, R1, R1 ;计算4*i(第4个参数) BL fcn ;调用C程序 ADD sp, sp, #4 ;从堆栈中删除第五个参数 .end 假设程序进入

    1.7K40

    如何使用ThreadStackSpoofer隐藏Shellcode内存分配行为

    ThreadStackSpoofer是线程堆栈欺骗技术一个示例实现,旨在规避恶意软件分析、反病毒产品和EDR在检查线程调用堆栈中查找Shellcode引用。...其思想是隐藏对线程调用堆栈针对Shellcode引用,从而伪装包含了恶意代码内存分配行为。...函数返回地址会分散在线程堆栈内存区域周围,由RBP/EBP寄存器存储其指向。...为了在堆栈找到它们,我们需要首先收集指针,然后取消对它们引用以进行覆盖: *(PULONG_PTR)(frameAddr + sizeof(void*)) = Fake_Return_Address...工具使用演示 下面的例子中,演示了没有执行欺骗技术时堆栈调用情况: 开启线程堆栈欺骗之后堆栈调用情况如下图所示: 上述例子中,我们可以看到调用栈中最新为MySleep回调。

    1.3K10
    领券