内存越界引用和缓冲区溢出

c语言对数组不进行边界检查,可能会导致,数组越界访问,导致存储越界,将数组的数据写入其他缓冲区。导致数据丢失、错误。
出现问题的原因:

图片来源https://blog.csdn.net/snowq/article/details/1749087
栈的存储,按照地址从大到小进行存储,先进后出的规则,也就是说后进入的数据存储的地址,要比先进入的数据存储的地址要小。
当给数组分配一个内存时,先将地址做减法,然后每存储一个数据,指针做加法。
如果我们声明一个数组,然后进行存储数据,当数组越界访问时,由于c语言并不会做边界检查所以,当指针存储到最后一个数据时,指针做加法,指向的并不是数组存储的范围,就会导致将其他数据覆盖、更改。
缓冲区溢出导致的问题:

  • 可能会将返回时执行语句的地址重写,导致执行原本不会执行的函数。
  • 会启动一个shell程序,给攻击者提供操作系统的函数。

对抗缓冲区溢出攻击

栈的随机化

如果攻击者攻击系统,既要插入代码,还要插入指向这段代码的指针,如果攻击者可以知道这段代码的指针,直接插入指针,则可以执行这段代码。
在程序开始时,在栈上分配一段0~n字节随机大小的空间,程序不使用这段空间但是它会导致后续程序执行时,栈的位置发生变化。

栈破坏检测

使用栈保护者机制,在栈帧中任何局部缓冲区与栈状态之间存储一个特殊的金丝雀值,并在恢复寄存器状态和从函数返回之前,程序检查这个金丝雀值,判断是否被更改,如果是,则程序异常终止。

限制可执行代码区域

只有编译器产生的代码的那部分内存才需要是可执行的,其他部分可以被限制为只允许读写。

支持边长栈帧

当一个固定长度的数组分配内存时,可以给定固定的内存,但是如果一个变量作为数组的长度,就会导致分配的内存不固定。引入栈指针和帧指针。

图片来源https://blog.csdn.net/shijunwang/article/details/80217237
大概步骤:

  • 先将%rbp寄存器数据压入栈中。
  • 计算地址,由于是指针,所以一个元素占用8个字节,所以,按照8的倍数计算,并且,还要将数据对齐,向下取整到最近的16的倍数。
  • 计算变长数组的首地址,将除以8(8字节),向上取整。再将地址乘8,得到首地址。

深入理解计算机系统——缓存溢出、对抗缓存溢出的攻击、支持变长栈帧相关推荐

  1. 深入理解计算机系统_第三章_程序的机器级表示

    深入,并且广泛-沉默犀牛 文章目录 文章导读 历史观点 程序编码 机器级代码 代码示例 关于格式的注解 数据格式 访问信息 操作数指示符 数据传送指令 数据传送示例 压入和弹出栈数据 算术和逻辑操作 ...

  2. 《深入理解计算机系统(原书第三版)》pdf

    下载地址:网盘下载 内容简介  · · · · · · 和第2版相比,本版内容上*大的变化是,从以IA32和x86-64为基础转变为完全以x86-64为基础.主要更新如下: 基于x86-64,大量地重 ...

  3. 深入理解计算机系统(CSAPP)含lab详解 完结

    文章目录 深入理解计算机操作系统-第一章 1.1 信息就是位 + 上下文 1.2 程序被其他程序翻译成不同的格式 1.3 了解编译系统如何工作是大有益处的 1.4 处理器读并解释储存在内存中的指令 1 ...

  4. 深入理解计算机系统——知识总结

    第 1 章 计算机系统漫游 #include <stdio.h>int main() {printf ( "Hello, world\n") ;return 0; } ...

  5. 《深入理解计算机系统》学习笔记:程序的机器级表示

    目录 概述 一.历史观点 二.程序编码 2.1.机器级代码 2.2.代码示例 2.3.关于格式的注解 三.数据格式 四.访问信息 4.1.操作符指示符 4.2.数据传送指令 4.2.1.源操作数和目的 ...

  6. 深入理解计算机系统(v3) 第三章、程序的机器级表示(Linux)

    程序调试:gcc -Og -o p p1.c p2.c 反汇编 objdump -d p 寄存器 函数参数第1到第6个参数:%rdi %rsi %rdx %rcx %r8 %r9 返回值 %rax 栈 ...

  7. 【收藏】CSAPP深入理解计算机系统三万字长文解析

    CSAPP深入理解计算机系统 文章目录 CSAPP深入理解计算机系统 信息 信息存储 字长 字节序 位运算 位运算符 逻辑运算 移位运算 整数 补码规则 表示范围 整数运算 浮点数 编码 规格化数 阶 ...

  8. 深入理解计算机系统:寄存器溢出问题的原理、对性能的影响(register spilling)

    <深入理解计算机系统>第5章的5.11.1介绍了寄存器溢出(register spilling)问题,请结合教材给出的简单实例,阐释为什么会出现寄存器溢出问题?寄存器溢出问题为什么会影响性 ...

  9. 计算机系统实验五:缓冲区溢出攻击

    参考教材:计算机系统基础 第二版 袁春风 机械工业出版社 参考慕课:计算机系统基础(四):编程与调试实践 https://www.icourse163.org/learn/NJU-1449521162 ...

最新文章

  1. OKR目标管理法不会用?看最新客户服务团队OKR模板
  2. android文件系统管理
  3. SQL15 查看学校名称中含北京的用户(通配符使用)
  4. webpack+vue实现项目
  5. 图像迁移风格保存模型_图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用...
  6. 磁盘移臂调度实验_10 Swarm 的安装和基本的服务编排调度
  7. 在线php网站扫描,php实现在线端口扫描实例代码_PHP教程
  8. [CSS学习] line-height属性讲解
  9. Win7-64位系统安装vs2003
  10. MySQL复制表的三种方式
  11. oracle分页查询最高效,oracle 分页 高效写法总结
  12. 人脸识别产品问题及改进方法
  13. 我去补了个牙,然后发现,未知的恐惧让人很绝望
  14. mysql的配置文件(my.ini或者 my.cnf)所在位置
  15. Debug与Release版本的区别
  16. python新浪股票接口_python 爬虫sina股票数据
  17. 在Jetson Nano上学习ROS的记录(版本Ubuntu18.04,课程来源赵虚左老师的《ROS理论与实践》)第十二章 机器人导航(仿真)
  18. zip压缩到指定目录
  19. 2022年3月份合肥教师考编报名(报名数学学科)
  20. 备战秋招-oppo java一面 面经

热门文章

  1. quartus ii matlab,基於Quartus II和MATLAB的FIR濾波器設計與仿真(二)
  2. 2022年煤气考试练习题模拟考试平台操作
  3. openpose:Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ∗
  4. 符号执行android,Android的fuzz测试技术之符号执行浅谈-android学习之旅(82)
  5. Android音视频开发:MediaRecorder录制视频
  6. 英特尔重磅亮相中国开源顶会,分享开源心经:开源开放、生态共赢
  7. Matlab丑恶嘴脸 | MathWorks Account Unavailable - Technical Issue
  8. 客户端性能测试——WeTest工具的使用
  9. ESET NOD32 Antivirus 13.1.21.0 免激活版
  10. 杰理之设置DAC单声道,播放蓝牙有杂音【篇】