ROP系统攻击

ROP全称为Return-oriented Programming(面向返回的编程)是一种新型的基于代码复用技术的攻击,攻击者从已有的库或可执行文件中提取指令片段,构建恶意代码。

仍要利用栈溢出才能自由跳转。

简介

ROP攻击同 缓冲区溢出攻击,格式化字符串漏洞攻击不同,是一种全新的攻击方式,它利用代码复用技术。

核心思想

ROP的核心思想:攻击者扫描已有的 动态链接库和可执行文件,提取出可以利用的指令片段(gadget),这些指令片段均以ret指令结尾,即用ret指令实现指令片段执行流的衔接。操作系统通过栈来进行函数的调用和返回。函数的调用和返回就是通过压栈和出栈来实现的。每个程序都会维护一个程序运行栈,栈为所有函数共享,每次函数调用,系统会分配一个栈桢给当前被调用函数,用于参数的传递、局部变量的维护、返回地址的填入等。栈帧是程序运行栈的一部分 ,在 Linux中 ,通过%esp和 %ebp寄存器维护栈顶指针和栈帧的起始地址 ,%eip是程序计数器寄存器 [1] 。而ROP攻击则是利用以ret结尾的程序片段 ,操作这些栈相关寄存器,控制程序的流程,执行相应的gadget,实施攻击者预设目标 。ROP不同于retum-to-libc攻击之处在于,R0P攻击以ret指令结尾的函数代码片段 ,而不是整个函数本身去完成预定的操作。从广义角度讲 ,return-to-libc攻击是ROP攻的特例。最初ROP攻击实现在x86体系结构下,随后扩展到各种体系结构.。与以往攻击技术不同的是,ROP恶意代码不包含任何指令,将自己的恶意代码隐藏在正常代码中。因而,它可以绕过W⊕X的防御技术。

内在特征

ROP也有其不同于正常程序的内在特征:

(1)ROP控制流中,call和ret指令不操纵函数,而是用于将函数里面的短指令序列的执行流串起来,但在正常的程序中,call和ret分别代表函数的开始和结束;

(2)ROP控制流中,jmp指令在不同的库函数甚至不同的库之间跳转,攻击者抽取的指令序列可能取自任意一个二进制文件的任意一个位置,这很不同于正常程序的执行。比如,函数中部提取出的jmp短指令序列,可将控制流转向其他函数的内部;而正常程序执行的时候,jmp指令通常在同一函数内部跳转。

ROP攻击的防范:ROP攻击的程序主要使用栈溢出的漏洞,实现程序控制流的劫持。因此栈溢出漏洞的防护是阻挡ROP攻击最根源性的方法。如果解决了栈溢出问题,ROP攻击将会在很大程度上受到抑制。

注:Linux是一种开源操作系统,更准确地说Linux提供了内核 [2] ,其上运行 GNU 开源项目的各种程序 [3] ,提供了丰富的功能和强大的扩展性。事实上,基于 GNU / Linux 架构有很多 Linux 的不同发行版,比较著名的包括 Gentoo, Arch Linux, debian, Ubuntu, Fedora, Mandria, SUSE等,也有专注服务器端的 Redhat Enterprise,CentOS等。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 7.5 变量的存储方式和生存期

    4、全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。

    闫小林
  • KVM影子页表

    2019年是崭新的一年,Linux kernel 5.0 低调发布了,给我的感觉就是,牛人不断在飞跃,我们也要策马奔腾赶紧追赶才有些许出路。

    jeff xie
  • 【故障排查】nginx504

    upstream timed out (10060: A connection attempt failed because the connected par...

    needrunning
  • 一条502报警引发的胡思乱想

    就在安心养神的时候, 同事转给了我一条nginx 502的报警, 赶紧去线上一顿排查。

    用户2825413
  • Java8内存结构的改变~

    根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。

    Spark学习技巧
  • 编程小白 | 每日一练(89)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    闫小林
  • 蛋蛋读NVMe之二: 吉祥三宝

    Host往SQ中写入命令, SSD往CQ中写入命令完成结果。SQ与CQ的关系,可以是一对一的关系,也可以是多对一的关系,但不管怎样,他们是成对的:有因就有果,有...

    Linux阅码场
  • 多线程编程之自旋锁

      自旋锁是专为防止多处理器并发(实现保护共享资源)而引入的一种锁机制。自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,...

    物流IT圈
  • 用Jetson NANO做个机器狗?

    注意是“准备”阶段....Wilk表示:This Project is heavily work in progress and may change ever...

    GPUS Lady
  • 怎么在Nginx禁止PHP的执行权限

      在虚拟主机配置文件中增加php_flagengineoff指令即可,配置如下:

    习惯说一说

扫码关注云+社区

领取腾讯云代金券