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

博客介绍了内存越界引用和缓冲区溢出情况,以栈区为例,说明输入不同字节数量对栈区的影响。还阐述了对抗缓冲区溢出攻击的方法,包括栈随机化,即每次运行随机处理栈地址;栈破坏检测(金丝雀),在栈帧特定位置存随机哨兵值,运行时检查其是否改变。

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

void echo()
{
    char buf[8];
    gets(buf);
    puts(buf);
}

栈区如上图所示,echo会在栈顶区域分配8字节大小给buf,当输入的字节数量0-7时,不会对栈造成破坏,当输入9-23字节时,由于是空区域,所以也不会造成破坏,但是当输入>24字节时,会修改返回地址数据,对整个栈区造成破坏。

对抗缓冲区溢出攻击

  • 栈随机化

程序每次运行,就栈的地址都采用随机化处理。

  • 栈破坏检测(金丝雀)

其思想是在栈帧中任何局部缓冲区与栈状态之间存储一个特殊的金丝雀值,也成为哨兵值,是在程序每次运行时随机产生的。在恢复寄存器状态和从函数返回之前,程序检查这个金丝雀值是否被改变,如果是,那么程序异常中止。这个金丝雀的值是在程序运行时从内存中读入存在栈中,比较的时候就将栈中的值与内存的值做XOR运算。

<think>好的,我需要回答用户关于如何配置MSPM0G3519的MPU来防止内存越界的问题。首先,我得先了解MSPM0G3519这款微控制器的MPU(内存保护单元)的基本原理配置方法。 用户提到的是MPU的配置,防止内存越界内存越界通常指的是程序错误地访问了不属于它的内存区域,比如数组越界、栈溢出等,这可能导致系统崩溃或安全漏洞。MPU的作用就是通过设置内存区域的访问权限,限制不同部分的代码只能访问特定的内存区域,从而防止这类错误。 首先,我需要查阅MSPM0G3519的技术手册,特别是关于MPU的部分。可能涉及的步骤包括:了解MPU支持的内存区域数量、每个区域的基地址大小设置、访问权限(读、写、执行)以及是否启用缓存等属性。 然后,配置MPU的一般步骤可能是这样的:初始化MPU、定义需要保护的内存区域(比如代码区、数据区、堆栈区等)、设置每个区域的基地址大小、配置访问权限,最后启用MPU。需要注意的是,不同的区域可能会有不同的优先级,当发生访问冲突时,MPU会触发异常,这时需要编写异常处理函数来应对。 可能还需要考虑如何划分内存区域。例如,代码区通常设置为只读可执行,数据区为读写,堆栈区可能需要限制其范围以防止溢出到其他区域。同时,外设寄存器所在的地址空间可能需要特别配置,确保只有授权的代码才能访问。 另外,用户可能还需要了解如何在开发环境中具体实现这些配置,比如使用TI的CCS(Code Composer Studio)或者IAR等IDE,如何编写相关的初始化代码,是否有库函数或者寄存器直接操作的方式。例如,TI的DriverLib可能提供了MPU配置的API,可以直接调用这些函数来设置区域属性。 还需要注意,配置MPU后可能会对系统性能产生一定影响,因为每次内存访问都需要检查权限。因此,需要合理规划内存区域,尽量减少区域的数量复杂性,同时确保关键区域得到保护。 最后,可能还需要提供示例代码,展示如何配置MPU的具体步骤,比如设置基地址寄存器、属性寄存器、使能MPU等。同时,提醒用户在配置后测试系统,确保没有误触发保护异常,并且系统功能正常。 总结来说,回答需要包括MPU的基本原理、配置步骤、内存区域划分建议、具体代码示例以及注意事项。同时,要确保引用相关的技术文档或用户手册作为参考,比如TI的MSPM0G3519数据手册或应用笔记。</think>### MSPM0G3519 MPU 配置防止内存越界的方法 #### 1. **MPU 基本原理** MPU(Memory Protection Unit)通过划分内存区域并设置访问权限(读/写/执行)来限制非法访问。当代码尝试越界访问时,MPU 会触发异常,防止内存损坏[^1]。 #### 2. **配置步骤** **(1) 初始化 MPU** 在系统启动时启用 MPU,通常需配置控制寄存器: ```c // 启用 MPU(具体寄存器名称需参考手册) MPU->CTRL |= MPU_CTRL_ENABLE_Msk; ``` **(2) 划分内存区域** - **代码区(FLASH)**:设置为只读+可执行。 - **数据区(SRAM)**:读写权限,禁止执行。 - **堆栈区**:限制其范围,防止溢出。 - **外设寄存器**:仅允许特定模块访问。 **(3) 设置区域基址与大小** 每个区域需配置基地址寄存器(Base Address)属性寄存器(Attribute): ```c // 示例:配置 SRAM 区域(假设基地址为 0x20000000,大小 64KB) MPU->RBAR = 0x20000000 | MPU_RBAR_VALID_Msk | (Region_Number << MPU_RBAR_REGION_Pos); MPU->RASR = MPU_RASR_ENABLE_Msk | MPU_RASR_SIZE_64KB | MPU_RASR_AP_RWNO | // 读写权限,禁止执行 MPU_RASR_TEX_S_C_B; // 内存类型属性 ``` **(4) 优先级与异常处理** - 区域编号越小优先级越高。 - 需编写 `HardFault_Handler` 处理 MPU 触发的异常,记录错误地址。 #### 3. **关键代码示例** ```c void MPU_Config(void) { // 禁用 MPU 后配置 MPU->CTRL = 0; // 配置 FLASH 区域(只读+可执行) MPU->RBAR = 0x00000000 | MPU_RBAR_VALID_Msk | (0 << MPU_RBAR_REGION_Pos); MPU->RASR = MPU_RASR_ENABLE_Msk | MPU_RASR_SIZE_1MB | MPU_RASR_AP_PRO; // 配置 SRAM 区域(读写,禁止执行) MPU->RBAR = 0x20000000 | MPU_RBAR_VALID_Msk | (1 << MPU_RBAR_REGION_Pos); MPU->RASR = MPU_RASR_ENABLE_Msk | MPU_RASR_SIZE_64KB | MPU_RASR_AP_RWNO; // 启用 MPU 默认内存映射 MPU->CTRL = MPU_CTRL_ENABLE_Msk | MPU_CTRL_PRIVDEFENA_Msk; __ISB(); // 确保指令同步 } ``` #### 4. **验证与调试** - 使用调试器触发越界访问,观察是否进入 `HardFault_Handler`。 - 检查堆栈指针是否在设定范围内。 #### 5. **注意事项** - 避免过度划分区域(通常支持 8-16 个区域)。 - 外设寄存器需按模块单独保护(如 GPIO、UART)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值