骇客基础知识:第3部分
因此,我们以前都编译过程序,但是您知道计算机是如何分割并保存程序的不同部分的吗? 请耐心等待,这种感觉一开始让我不知所措。 让我们跳进去。
编译后的程序分为五个部分:文本,数据,bss,堆和堆栈。
文本段是程序的机器语言指令所在的位置。 当程序开始执行时,RIP(指向当前正在执行的指令的寄存器)被设置为文本段中的第一条机器语言指令。 然后,处理器在执行指令时会遵循执行循环:
- 读取RIP指向的指令
- 将指令的字节长度添加到RIP
- 执行在步骤1中读取的指令
- 返回步骤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部分相关推荐
- 初学者的技术写作:技术博客基础知识A-Z指南
如果你喜欢写作和技术,技术写作可能是一个适合你的职业.如果你喜欢技术,但又不是真的整天喜欢编码,也可以做一些别的事情. 如果你喜欢通过教导他人来学习,为开源项目做出贡献,并教导他人如何做到这一点,或者 ...
- 3G应用开发之Android 传智播客 基础知识总结
3G应用开发之Android Android应用开发之3G 3G应用开发之Android 3G应用开发之Android 应用开发之 讲师: 讲师:黎活明 北京传智 播客教育 www.itcast.c ...
- LeetCode 牛客网 C++ 算法 刷题必备基础知识
LeetCode 牛客网 C++ 算法 刷题必备基础知识 {ignore} 文章目录 LeetCode 牛客网 C++ 算法 刷题必备基础知识 {ignore} main综合模板 数组排序库 字符串库 ...
- Django 搭建博客网站-task01:基础知识
Django 搭建博客网站 目录 Django 搭建博客网站 前言 一.pythonpythonpython 基础知识 二.HTML5HTML5HTML5 基础知识 三.vscodevscodevsc ...
- 基础知识学习---牛客网C++面试宝典(五)C/C++基础之新特性
1.本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习: 暂时只有2023年3月份,第一次社招找工作的过程: 2.个人经历: 研究生期间课题是SLAM在无 ...
- 计算机网络相关知识 参考博客 子网掩码怎么理解 网关及网关的作用 路由器基础知识详解
子网掩码怎么理解 https://blog.csdn.net/farmwang/article/details/64132723 网关及网关的作用 https://blog.csdn.net/zhao ...
- java知识点博客园_JAVA基础知识回顾
JAVA基础知识回顾 一.背景介绍 JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java 2 Platfo ...
- 相机基础知识博客汇总
工业相机成像原理 相机镜头工作原理 工业相机镜头基础知识 透镜.小孔和眼球成像原理 变焦.对焦.景深的理解
- 黑客术语基础知识快速了解
黑客术语基础知识快速了解 1.肉鸡:所谓"肉鸡"是一种很形象的比方,比方那些能够随意被我们操控的电脑,对方可所以WINDOWS体系,也可所以UNIX/LINUX体系,可所以一般的个 ...
- 黑客与“骇客”的区别,5分钟告诉你如何成为一名合格的黑客
仅用一台电脑 就能黑手机 黑银行卡. 黑摄像头. 让 ATM 疯狂吐钞, 真的是太酷了- 试问谁还能没有个黑客梦呢? 什么是黑客 "黑客"是一个极具魅力的技术领域,但成为一名&qu ...
最新文章
- 大学计算机html,编程基础(C+VB+HTML)(辅)19级计算机
- SQL Server数据库大型应用解决方案总结(转载)
- 场景/故事/story——寻物者发布消息场景、寻失主发布消息场景、消息展示场景、登录网站场景...
- 协程库st(state threads library)原理解析
- CentOS7安装EPEL源
- recyclerview 横向卡片效果_UI设计中卡片式应如何设计
- 获取ftp服务器的系统编码,ftp服务器编码问题
- Spring中的jar包详解
- 如何用计算机解锁苹果手机,教你怎么使用Apple Watch手表解锁苹果Mac电脑
- 简述一下原型 / 构造函数 / 实例
- 滚动轴承的代号表示方法
- 启动auditd时,报错如下,怎么解决?
- springbooot学习记录
- 呼叫中心-自动外呼接口设置
- 找到100亿个URL中重复的URL
- [一起看海吧]2021.5.1秦皇岛北戴河之旅游记
- 如何在pdf中加入手写签名
- VulnStack-ATTCK-3(红日靶场三)
- 计算机视觉:支持M:N匹配与活体检测的百度人脸Api调用典例
- BGP线路是什么意思?BGP三线的优点是什么?
热门文章
- Android解析XML文件(assets目录)
- 欣赏的心态去发现生活中的美
- AutoCAD的所有的序列号和秘钥
- 计算机电源不能启动不了,电脑不开机,常见原因有哪些,怎么处理,黑屏怎么办...
- 恒指2.25日预测及操作建议
- 寻找丢失的iexplore进程
- 修改mysql wait timeout_MySQL wait_timeout参数修改
- 6319. 【省选组】【USACO 2019 February Platinum】Problem 3. Mowing Mischief
- WordPress Contact Form插件‘cntctfrm_contact_emai’参数跨站脚本漏洞
- windows 7 远程桌面连接图文教程