骇客基础_骇客基础知识:第3部分

骇客基础

因此,我们之前都编译过程序,但是您知道计算机是如何分割并保存程序的不同部分的吗? 请耐心等待,这种感觉一开始让我不知所措。 让我们跳进去。

编译后的程序分为五个部分:文本,数据,bss,堆和堆栈。

文本段是程序的机器语言指令所在的位置。 当程序开始执行时,RIP(指向当前执行指令的寄存器)被设置为文本段中的第一条机器语言指令。 然后,处理器在执行指令时会遵循执行循环:

  1. 读取RIP指向的指令
  2. 将指令的字节长度添加到RIP
  3. 执行在步骤1中读取的指令
  4. 返回步骤1

您无法写入内存的文本段。 尝试这样做将导致程序被杀死。 文本存储段的大小固定。

  • 数据部分用于存储初始化的全局变量和静态变量。
  • bss部分用于存储未初始化的全局和静态变量。

尽管它们的大小都是固定的,但它们都是可写的。 全局变量和静态变量能够持久化(与函数上下文无关),因为它们存储在自己的内存段中。

内存的堆部分直接在程序员的控制之下。 在C语言中,程序员可以使用函数malloc()在堆上动态分配内存。 堆的大小不是固定的,并且可以变大或变小。 堆的增长“朝着更高的内存地址向下移动”(《黑客:剥削的艺术》,乔恩·埃里克森)。 让我们用一个在堆上进行后续内存分配的程序来说明这一点:

让我们执行程序以查看内存地址:

打印的第一个地址为0x21c5010 ,第二个地址位于其下方(视觉上)为0x21c51b0 (较高的地址)。

内存的堆栈部分用于在函数调用期间存储局部函数变量和上下文。 堆栈大小不固定。 调用函数时

该函数将具有自己的一组传递变量,并且该函数的代码将在文本段中的不同内存位置。 由于调用函数时上下文和RIP必须更改,因此堆栈用于记住所有传递的变量,函数完成后RIP应该返回的位置以及该函数使用的所有局部变量,” (埃里克森)。

此信息存储在堆栈帧中。 堆栈(内存堆栈)由许多不同的堆栈帧组成。 与堆相反,堆栈(在视觉上)朝着较低的内存地址向上增长。

由于堆栈和堆都是动态的,也就是说,它们的大小取决于程序员使用的内存量而变化,因此它们朝着彼此相反的方向增长是有意义的。 这“最小化了浪费的空间,如果堆很小,则允许堆栈变大,反之亦然”(Erickson)。

RSP寄存器保存堆栈末尾的地址。 重要的是要注意,RSP寄存器是由多个CPU指令隐式操纵的:PUSH,POP,CALL RET等。这就是为什么我们看不到汇编指令在CALL指令后重置RSP寄存器的值的原因。

调用函数时,有几件事被压入堆栈帧:RBP寄存器(也称为成帧器指针(FP))

“用于引用当前堆栈帧中的局部函数变量,[…]函数的参数,其局部变量以及两个将它们恢复原状所必需的指针:保存的帧指针(SFP)和寄信人地址。 SFP用于将EBP恢复到其先前的值,而返回地址用于将RIP恢复到在函数调用之后找到的下一条指令。”(Erickson)。

RBP寄存器仅被显式操作。

让我们来说明一下当运行一个简单函数时堆栈上发生了什么:

让我们反汇编main()函数:

您可以看到test_function()的每个参数都被压入堆栈。 当执行CALL指令时,

“返回地址被压入堆栈,执行流跳到0x40055d处test_function()的开头,”(Erickson)。

在这种情况下,返回地址将是CALL指令之后的指令。 在test_function()返回之后,RIP将指向0x4005be

让我们反汇编test_function()

请注意,RBP已推入堆栈。 这称为保存的帧指针(SFP),以后用于将RBP恢复回先前的帧。 然后将RSP复制到RBP中以设置新的帧指针。 这很有意义,因为使用RBP来引用当前堆栈帧中的局部函数变量。 还要注意,RBP正在显式操作。 最后,我们看到从RSP的值中减去40,这是为了为局部变量buffer和flag节省内存。

我们可以观察到堆栈如何使用GDB进行更改。 首先让我们添加一些断点:

让我们跳到下一个断点:

您可以看到RSP,RBP和RIP寄存器在地址空间中向下移动到了较低的地址。 我们还看到,由于我们在test_functions反汇编中看到了“ SUB RSP,0X40”指令,因此RSP与RBP之差为40,这是有道理的。

最后,堆栈框架如下所示:

test_function()终止后,堆栈帧从堆栈弹出,并且RIP设置为返回地址,因此程序可以继续执行。 RBP还被设置为已保存的帧指针的值,因此它可以在先前的堆栈帧中引用局部变量。 堆栈帧的创建和终止循环一直持续到程序完成执行为止。

翻译自: https://hackernoon.com/the-basics-of-hacking-part-3-u2ej36x2

骇客基础

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值