内存攻击原理

内存攻击:是指攻击者利用软件安全漏洞,构造恶意输入,导致软件在处理数据流是出现非预期错误,将输入数据写入内存中的某些特定位置,从而劫持软件控制流,转而执行外部输入的指令代码,造成目标系统被获取远程控制权限或者被拒绝服务

内存攻击的表面原因:软件编写错误,如过滤输入的条件设置缺陷、变量类型转换错误、逻辑判断错误、指针引用错误等。

根本原因:没有在内存中严格区分数据和指令

 

缓冲区溢出:程序缺乏对缓冲区的边界条件检查而引起的一种异常行为。通常是程序向缓冲区中写数据,但是内容超过了程序员设定的缓冲区边界,从而覆盖了相邻的内存区域,造成覆盖程序中的其他变量甚至影响控制流的敏感数据,造成程序的非预期行为。

一般根据缓冲区溢出的内存位置不同,将缓冲区溢出分为栈溢出 (Stack Overflow)堆溢出 (Heap Overfolw)

栈区 (Stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。是用操作系统创建和维护的。

函数代码执行完后会通过 ret 指令从栈中弹出返回地址,装载到 EIP 指令寄存器,从而继续程序的执行。程序向栈中的内存地址写数据时,当写入的数据长度超过栈分配给缓冲区的空间时,就会造成栈溢出。

覆盖函数返回地址利用方式,栈溢出前后栈空间内存布局:

 

堆区 (Heap):一般由程序员分配释放,若程序员不释放,程序结束时由 OS 回收。堆是程序运行时动态分配的内存,用户通过 malloc、new 等函数申请内存,通过返回的起始地址指针对分配的内存进行操作,使用完以后要通过 free、delete 等函数释放。

待续。。。。。。

posted @ 2019-07-11 20:26  _liuxg  阅读(1236)  评论(0编辑  收藏  举报