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

编译后的程序分为五个部分:文本,数据,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还被设置为已保存的帧指针的值,因此它可以引用先前堆栈帧中的局部变量。 堆栈帧的创建和终止循环一直持续到程序完成执行为止。

From: https://hackernoon.com/the-basics-of-hacking-part-3-u2ej36x2

骇客基础知识:第3部分相关推荐

  1. 初学者的技术写作:技术博客基础知识A-Z指南

    如果你喜欢写作和技术,技术写作可能是一个适合你的职业.如果你喜欢技术,但又不是真的整天喜欢编码,也可以做一些别的事情. 如果你喜欢通过教导他人来学习,为开源项目做出贡献,并教导他人如何做到这一点,或者 ...

  2. 3G应用开发之Android 传智播客 基础知识总结

    3G应用开发之Android Android应用开发之3G  3G应用开发之Android 3G应用开发之Android 应用开发之 讲师: 讲师:黎活明 北京传智 播客教育 www.itcast.c ...

  3. LeetCode 牛客网 C++ 算法 刷题必备基础知识

    LeetCode 牛客网 C++ 算法 刷题必备基础知识 {ignore} 文章目录 LeetCode 牛客网 C++ 算法 刷题必备基础知识 {ignore} main综合模板 数组排序库 字符串库 ...

  4. Django 搭建博客网站-task01:基础知识

    Django 搭建博客网站 目录 Django 搭建博客网站 前言 一.pythonpythonpython 基础知识 二.HTML5HTML5HTML5 基础知识 三.vscodevscodevsc ...

  5. 基础知识学习---牛客网C++面试宝典(五)C/C++基础之新特性

    1.本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习: 暂时只有2023年3月份,第一次社招找工作的过程: 2.个人经历: 研究生期间课题是SLAM在无 ...

  6. 计算机网络相关知识 参考博客 子网掩码怎么理解 网关及网关的作用 路由器基础知识详解

    子网掩码怎么理解 https://blog.csdn.net/farmwang/article/details/64132723 网关及网关的作用 https://blog.csdn.net/zhao ...

  7. java知识点博客园_JAVA基础知识回顾

    JAVA基础知识回顾 一.背景介绍 JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java 2 Platfo ...

  8. 相机基础知识博客汇总

    工业相机成像原理 相机镜头工作原理 工业相机镜头基础知识 透镜.小孔和眼球成像原理 变焦.对焦.景深的理解

  9. 黑客术语基础知识快速了解

    黑客术语基础知识快速了解 1.肉鸡:所谓"肉鸡"是一种很形象的比方,比方那些能够随意被我们操控的电脑,对方可所以WINDOWS体系,也可所以UNIX/LINUX体系,可所以一般的个 ...

  10. 黑客与“骇客”的区别,5分钟告诉你如何成为一名合格的黑客

    仅用一台电脑 就能黑手机 黑银行卡. 黑摄像头. 让 ATM 疯狂吐钞, 真的是太酷了- 试问谁还能没有个黑客梦呢? 什么是黑客 "黑客"是一个极具魅力的技术领域,但成为一名&qu ...

最新文章

  1. 大学计算机html,编程基础(C+VB+HTML)(辅)19级计算机
  2. SQL Server数据库大型应用解决方案总结(转载)
  3. 场景/故事/story——寻物者发布消息场景、寻失主发布消息场景、消息展示场景、登录网站场景...
  4. 协程库st(state threads library)原理解析
  5. CentOS7安装EPEL源
  6. recyclerview 横向卡片效果_UI设计中卡片式应如何设计
  7. 获取ftp服务器的系统编码,ftp服务器编码问题
  8. Spring中的jar包详解
  9. 如何用计算机解锁苹果手机,教你怎么使用Apple Watch手表解锁苹果Mac电脑
  10. 简述一下原型 / 构造函数 / 实例
  11. 滚动轴承的代号表示方法
  12. 启动auditd时,报错如下,怎么解决?
  13. springbooot学习记录
  14. 呼叫中心-自动外呼接口设置
  15. 找到100亿个URL中重复的URL
  16. [一起看海吧]2021.5.1秦皇岛北戴河之旅游记
  17. 如何在pdf中加入手写签名
  18. VulnStack-ATTCK-3(红日靶场三)
  19. 计算机视觉:支持M:N匹配与活体检测的百度人脸Api调用典例
  20. BGP线路是什么意思?BGP三线的优点是什么?

热门文章

  1. Android解析XML文件(assets目录)
  2. 欣赏的心态去发现生活中的美
  3. AutoCAD的所有的序列号和秘钥
  4. 计算机电源不能启动不了,电脑不开机,常见原因有哪些,怎么处理,黑屏怎么办...
  5. 恒指2.25日预测及操作建议
  6. 寻找丢失的iexplore进程
  7. 修改mysql wait timeout_MySQL wait_timeout参数修改
  8. 6319. 【省选组】【USACO 2019 February Platinum】Problem 3. Mowing Mischief
  9. WordPress Contact Form插件‘cntctfrm_contact_emai’参数跨站脚本漏洞
  10. windows 7 远程桌面连接图文教程