memory
内存解剖
计算机内存可以分为易失性和非易失性类型。两者之间的区别在于所存储的信息是否在设备断电后仍然保留。
缓冲区溢出 在 RAM 中的易失性内存上执行。具体来说,它们的目标是将内存“临时分配”给正在运行的程序。从基本意义上讲,缓冲区溢出允许攻击者“将数据写入超出易受攻击的代码中的函数调用或变量的预期存储边界”。
堆栈
堆栈内存是程序执行期间在 RAM 中分配的内存。它用于运行程序并跟踪代码中的函数和变量。
堆栈具有后进先出 (LIFO) 结构,这意味着其单元按字面量堆栈进行组织。如果堆栈上有三个对象,则第二个对象无法执行或引用,直到其上方的对象消失。
堆栈帧
堆栈帧也称为“激活帧”,是程序执行期间组成堆栈的单元。它们包含程序中定义和使用的子例程/函数和变量。堆栈上的第一帧是程序的“主”函数(无论执行进入何处)。
当程序被编译为机器代码/汇编时,它会生成CPU在执行程序时遵循的指令。这些指令的一部分包括*在执行期间调用函数时应如何创建和管理堆栈帧。
执行时,CPU 遵循这些指令并在 RAM 中分配内存以创建堆栈帧。每个堆栈帧对应一个函数调用并包含所有所需的信息(包括局部变量、函数参数、返回地址等)。
堆栈上的其余帧统称为“调用堆栈”,因为它们是在整个程序中调用函数时生成的。
当当前执行的堆栈帧的子例程/函数返回时,堆栈帧从堆栈顶部弹出并且其局部变量被擦除。
堆
与堆栈类似,堆是指 RAM 中的易失性内存,在程序执行期间分配。堆栈和堆的不同之处在于,堆旨在临时保存超出单个子例程/函数范围的数据。
例如,如果程序需要跨多个函数调用跟踪单个变量,则将分配堆内存来管理该变量而不是堆栈。这允许程序在需要时引用/访问变量,而不必将其排列在堆栈/ LIFO 结构中。
结构
堆的结构允许您以任何顺序访问存储在其中的变量/数据。这允许整个程序中的不同子例程访问值,但是添加和删除项目更加复杂(因此使用更多资源)。
[!资源]
[!我以前的笔记(在文本中链接)]
- 你可以在这里找到它们