缓冲区溢出漏洞是一种非常普遍且危险的漏洞,在各种操作系统、应用软件中广泛存在,在路由器中也不例外。利用缓冲区溢出攻击,可以造成程序运行失败、系统宕机、更为严重的是,利用缓冲区溢出攻击可以执行非授权指令,进而取得系统特权进行各种非法操作。本次内容主要分享和总结了MIPS程序的栈空间缓冲区溢出原理,并通过代码示例让你更进一步的体会缓冲区溢出漏洞的利用效果。

MIPS栈原理

这里的缓冲区主要指的是栈,所以,首先我们需要了解一下什么是栈,在计算机科学中,栈是一种具有先进后出(FILO)特性的数据结构。而函数的调用栈(Call Stack)就是指存放某个程序正在运行的函数的信息栈。调用栈由栈帧(Stack Frames)组成,每个栈帧则对应一个未完成运行的函数,在文稿中有一幅图表示了调用栈和栈帧的关系:

在x86计算机体系结构中,大部分编译器对函数的参数传递、局部变量分配和释放都是通过操作当前所在函数的栈帧实现的。在MIPS32架构中,函数调用时对函数栈帧的分配和使用方式与x86架构由很多相似之处,MIPS32架构中的栈可以结合一些寄存器完成诸如传递函数参数、局部变量保存、存储函数返回值、保存寄存器、恢复调用前处理器的状态等功能。

MIPS32架构堆栈

在MIPS32架构中,每次调用一个函数时,需要将当前调用栈的栈顶指针向下(也就是低地址方向)移动n个比特(也就是减去n个比特),这n个比特的空间就构成了当前被调用函数的栈帧。在这之后栈顶指针便不再移动,只能使用栈顶指针加上或减去一个偏移量来操作栈帧中的变量。最后,在函数返回时将栈顶指针再加上n个比特来恢复调用该函数前的栈现场。

读者可以查看文稿中的两幅图,分别代表了函数A调用函数B之前和函数B正在执行时栈顶指针(SP)的变化情况:


另外,在MIPS32架构中函数调用时的参数传递方式与x86有所不同,MIPS32中会将被调用函数的前4个参数通过a0a0~a0 a3传递。超过4个的部分被放到调用参数空间。

关于这个调用参数空间的概念,比如说,函数A调用函数B,函数A会在自己的函数栈空间中预留一部分空间来保存函数B的参数,这个预留的空间就是调用参数空间。

返回地址(RA寄存器)

对于理解MIPS32架构中的缓冲区溢出原理,还有一个很重要的知识点就是函数的返回地址,在MIPS架构下,假如函数A调用了strcpy函数时,会将调用strcpy函数后需要返回的地址存入RA寄存器。这样当执行完函数strcpy后,跳转指令会从RA寄存器取出返回地址,以便继续执行后续的指令调用。

void A(char *content) {unsigned char buf[32];strcpy(buf, content);B();
}

同样的,在A函数中调用的其他函数(如函数B)也可能基于同样的原因对RA寄存器进行修改,所以,在函数B刚开始运行时,会首先将RA寄存器的值保存到函数B的栈空间中,以便在函数B结束运行时从栈空间中恢复刚刚保存的RA寄存器的值。

同样的,为了防止函数A调用的其他函数对RA寄存器进行修改,在函数A刚开始运行时,会首先将当前的RA寄存器的值保存到函数A的栈空间中,然后在函数A的末尾处将RA寄存器的值进行恢复。

我在文稿中列出了一段C语言代码,和使用mips-linux-gcc编译器对这段代码编译后的反汇编代码,读者可以看图体会一下。对于汇编代码,你可能不太熟悉,我在后面的分享中会涉及,为了便于理解,这里你可以只看红色方框部分的汇编代码注释:

void A(char *content) {//栈空间[4] = $RAunsigned char buf[32];strcpy(buf, content);B();//$RA = 栈空间[4]
}

栈溢出原理

前面我们提到了,函数的参数及局部变量是存储在函数栈空间的,而为了保证多个函数级联调用时RA寄存器不会被非法覆盖,RA寄存器的值也会被存储到函数的栈空间,而且存储在RA寄存器中的函数返回地址在栈上保存的位置在其他函数参数及局部变量的高地址处,这样就意味着,如果函数中的局部变量所指向的内存存在溢出或越界的可能,溢出的部分就有可能覆盖到保存RA寄存器存储的函数返回地址处,如果溢出成功,那么当在函数尾部从栈空间恢复返回地址到RA寄存器时,使用的将会是溢出后的地址,也就是攻击者精心构造的地址,而这个地址指向的是攻击者精心构造的恶意指令,从而这些恶意指令得到了执行的机会,进而完成一些其他的非法操作。

这里我针对上面的示例代码中的函数A的栈空间画了一幅图,RA寄存器保存在栈空间的高地址处,缓冲区buf在栈空间的低地址处,如果使用strcpy函数时,并且在拷贝的数据长度超过了32字节时(比如64个字节的A),超出的部分就会将保存RA寄存器值的内存覆盖。


void main() {char ccc[64];memset(ccc, 'A', 64);A(ccc);
}

当函数A执行到末尾时,会从栈空间取出刚刚保存的RA地址对RA寄存器进行恢复:

当执行完恢复指令后,RA寄存器的值就变成了刚刚传入的“AAAA”。

最终在函数的末尾使用jr指令进行地址跳转时,就将程序的执行流程劫持到了AAAA地址处,本文中使用的示例传入的是“AAAA”,如果传入的不是“AAAA”,而是攻击者精心构造的存有恶意指令的地址,那么这些被精心构造的指令将会被执行。

今天我们结合示例代码讲解了路由器中缓冲区溢出的原理,在文稿中有一些反汇编代码,你可能对此有些陌生,但对于理解缓冲区溢出的原理并没有什么大的问题。不过,为了后面的ShellCode开发能够顺利进行,我在下次的分享中,将针对MIPS架构的汇编指令进行总结和分享。

最后,希望本次的分享能够给你带来帮助,谢谢大家。

十二、缓冲区溢出漏洞原理相关推荐

  1. 缓冲区溢出漏洞原理及Linux下利用

    常见保护措施 ASLR ASLR 是一种防范内存损坏漏洞被利用的计算机安全技术.ASLR通过随机放置进程关键数据区域的地址空间来防止攻击者能可靠地跳转到内存的特定位置来利用函数,以防范恶意程序对已知地 ...

  2. 缓冲区溢出漏洞攻击原理

    转自互联网 0x00 缓冲区溢出概念 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上, 理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但 ...

  3. 验证本地缓冲区溢出漏洞攻击

    Info:本篇主要是为了验证本地缓冲区溢出,这是理解缓冲区溢出攻击的第一步,有了这一步,才能更深刻的理解到什么是缓冲区漏洞攻击,从而对以后的学习奠定一定的基础(注意:以下请在linux环境下实验) 基 ...

  4. 缓冲区溢出漏洞攻击——Shellcode编写

    一.实验内容 利用一个程序漏洞,编写shellcode,达成效果:蹦出对话框,显示"You have been hacked!(by JWM)" 二.实验原理 因为输入了过长的字符 ...

  5. 缓冲区溢出漏洞浅析(三)

    前面发了两篇都是关于C语言缓冲区溢出的文章,有的同行问,是否C#.Java语言有缓冲区溢出问题吗?答案是否定的.由于C#.Java语言需要虚拟机去执行,属于托管语言,虚拟机会自动检查边界.一般不会出现 ...

  6. 永恒之蓝ms17-0109(缓冲区溢出漏洞)

    目录 一.漏洞介绍 二.SMB介绍 三.影响版本 四.漏洞原理 五.漏洞利用 六.环境搭建 七.漏洞复现 1.首先对靶机进行端口扫描看看是否开启了445端口 2.启动kali上的metasploit ...

  7. radareorg/radare2 堆缓冲区溢出漏洞(CVE-2022-1383)

    编号 CVE-2022-1383 标题 radareorg/radare2 堆缓冲区溢出漏洞 描述 Radare2(简称为r2 )是用于逆向和分析二进制文件的完整框架. GitHub 存储库中 5.6 ...

  8. 网络安全系列之三十五 缓冲区溢出

    缓冲区溢出的大名可谓如雷贯耳,我们不必去探究缓冲区溢出的原理,只需知道他能做什么就可以了.如果能够成功地对远程计算机进行缓冲区溢出,那么就可以获得远程计算机的Shell,也就可以直接以管理员的身份在远 ...

  9. CVE-2021-2429:MySQL InnoDB Memcached 插件中的堆缓冲区溢出漏洞详解

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 2021年4月,ZDI 收到了一名匿名者提供的关于MySQL 数据库中某漏洞的报告,结果是位于 InnoDB memcached 插件中的基于堆 ...

最新文章

  1. rsyslog的配置文件使用方法
  2. Zeppelin源码
  3. 程序员最喜爱的12个Android应用开发框架二(转)
  4. profile asp.net technology membership
  5. 微软热门知识点之------c#3.0新特性【转】
  6. Shell变量命名规则
  7. android 如何添加第3方lib库到kernel中
  8. iOS 文字样式处理总结(字体、前背景色、斜体、加粗、对齐、行间距、段间距、动态获取字符串label宽高等)...
  9. java隐藏与覆盖_Java 隐藏和覆盖
  10. python持久化数据_Python数据持久化-mysql篇
  11. Inflater与findViewById()区别
  12. Python可以这样学(第九季 机器学习案例与实战)-董付国-专题视频课程
  13. How MapReduce Works
  14. token详解及常见防范措施
  15. 在Spring3中使用注解(@Scheduled)创建计划任务
  16. MATLAB图像去雾算法
  17. 【面试】前端面试人事问题
  18. C#与VC相互调用之C#调用VC的DLL
  19. 重构——46令函数携带参数(Parameterize Method)
  20. excel单元格内容拆分_拆分单元格内容,表哥表妹不要哭

热门文章

  1. 用python写一个对会议室座位进行抽奖,并显示座位图,中奖座位变色显示,人工按开始,再按停的的程序...
  2. UWP平台和PC平台有什么区别
  3. 如何穿婚纱才能显得更高贵优雅
  4. 【调剂】贵州财经大学大数据统计学院关于2022年硕士研究生预调剂的通知
  5. 2023,如何为组织和自己定一个好的绩效目标?
  6. Mecanim的简单应用
  7. 力扣226:反转二叉树
  8. 配置 zabbix 监控 MySQL
  9. jQuery(五)Ajax、跨域
  10. opencv-python笔记-基础与直方图均衡