登录  | 加入社区

黑狼游客您好!登录后享受更多精彩

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 931|回复: 0

msf教程 使用MSFrop搜索代码漏洞 ROP编程原理

[复制链接]

 成长值: 35950

8169

主题

7094

帖子

6831

现金

黑狼创办人

Rank: 12Rank: 12Rank: 12

积分
6831
发表于 2017-10-31 21:55:26 | 显示全部楼层 |阅读模式 来自 广东汕尾
6.5.2使用MSFrop搜索代码漏洞


当您为较新版本的Windows操作系统开发攻击模块时时,您会发现它们默认启用了数据执行保护(DEP)。 DEP防止shell在堆栈中执行代码,于是攻击模块开发人员不得不另辟蹊径,找其他方法,于是Return Oriented Programming(ROP)面向返回地址编程就被开发出来了。
=begin
译者注:什么是ROP

面向返回地址的编程 return-oriented programming
ROP是一种计算机安全渗透技术。在被攻击对象使用了不可执行内存或代码签名等安全防御的情况,攻击者可以利用这项技术执行代码。
在这种技术中,攻击者获得调用堆栈的控制权以劫持程序控制流,然后执行精心挑选的已经存在于机器内存中的机器指令(被称为“小工具”)序列。每个小工具通常以返回指令结束,并且位于现有程序和/或共享库代码中的子例程中。通过将这些小工具精心地链接在一起,攻击者就可以在有一定安全防御机制的机器上执行任意操作。
背景知识
ROP是一种高级的栈攻击。在普通情况下,栈攻击会利用程序中的错误(通常是缓冲区溢出)来操纵“调用栈”(call stack)。在缓冲区溢出中,有些方法在存储用户提供的数据时没有执行边界检查,就会接受比正常情况更多的数据。如果数据被写入栈中,超出的数据可能会溢出分配给这个方法的空间(例如,下面图中的“local”方法),并覆盖返回地址。而这个地址稍后将由用于该方法的返回,上面的值将作为该方法调用者的返回地址。如果这一地址被覆盖,那么方法返回时被转移到攻击者指定的位置。
uiwtvXHjdP9OtHRj.jpg
在标准的缓冲区溢出攻击中,攻击者只需将有效载荷(“payload”)写入堆栈,然后用这些新写入的指令的位置覆盖返回地址。直到20世纪90年代末,主要的操作系统没有提供任何防范这些攻击的保护措施;直到2004年,Microsoft Windows才提供缓冲区溢出保护。最终,操作系统开始通过将数据写入的内存标记为不可执行来防止缓冲区溢出错误的攻击,这种技术称为数据执行预防(也就是DEP)。启用DEP后,机器将拒绝执行位于用户可写入存储器区域的任何代码,从而防止攻击者将堆栈中的攻击载荷置于栈中,并通过返回地址重写跳转到它。之后,又出现了硬件级别数据执行预防,以加强这一保护。
通过防止数据执行,攻击者无法执行恶意注入的指令,因为一般的缓冲区溢出会覆盖内存被标记为不可执行。为了解决这个问题,面向返回地址的编程(ROP)攻击将不会注入恶意代码,而是通过操作返回地址,使用内存中已经存在的程序的代码(称为“小工具”)来进行攻击。普通的数据执行预防(DEP)不能抵御这种攻击,因为对手没有使用恶意代码,而是通过更改返回地址,利用已有小工具组合“好”一套指令,这样的代码指令部分不会被标记为不可执行。
返回库技术
数据执行预防的广泛实施使得传统的缓冲区溢出漏洞难以或不可能以上述方式利用。相反,攻击者被限制为只能使用已经在内存中被标记可执行的内容的代码,包括程序本身的代码和共享链接库。由于共享链接库(如libc)中,通常包含用于执行系统调用的子例程和对攻击者可能有用的其他功能,因此它们是组装攻击代码的最佳选择。
在返回库攻击中,攻击者通过利用缓冲区溢出漏洞来劫持程序控制流程。与一般的栈溢出攻击不同,攻击者不是试图将攻击载荷写入栈,而是选择可用的库函数,并将返回地址覆盖其入口位置。然后遵守调用规则,覆盖更多的栈位置,小心翼翼地将适当的参数传递给该库方法,从而执行对攻击者有用的功能。
借用代码块
64位x86处理器的兴起带来了对子程序调用规则的改变,这个规则要求函数的第一个参数的传递者是寄存器而不是栈。这意味着攻击者不能再只通过操作调用栈来设置需要的参数,进行库函数调用了。同时,动态链接库的开发人员也开始删除或限制执行对攻击者特别有用的库函数,如系统调用包装器。因此,返回库攻击变得难以成功。
于是演变出另一种攻击的形式,就是使用库函数的部分而不是整个函数本身,来利用机器上的缓冲区溢出漏洞。该技术寻找从堆栈中pop值到寄存器的指令。仔细安排这些代码,攻击者可以将适当的值放入适当的寄存器中,以便根据新的调用规则执行函数调用。而攻击的其他部分和返回库攻击操作相同。
攻击
ROP编程基于上述这样借用代码块的方法,并扩展了它,为攻击者提供图灵完整的功能,包括循环和条件分支语句。(图灵完整可以理解为完整的编程能力)换句话说,ROP提供了一种完全功能的“语言”,攻击者可以使用这种“语言”来使受感染的机器执行任何所需的操作。 Hovav Shacham在2007年发布了该技术[9],并展示了如何利用目标应用程序C标准链接库,使用ROP实现主要编程功能,和如何利用缓冲区溢出漏洞。
ROP编程攻击能力超过上述讨论的说有手段。上述所有的防御技术,包括从共享库中删除危险方法可以有效抵御这种攻击。
=end
ROP载荷的创建是利用没有启用ASLR机制的二进制文件的指令集组装而成,以使您的shellcode可执行。每组指令需要以RETN指令中结束,并便连续执行下组指令,形成指令链。这些指令组称为小工具。
Y9073SRB9AAoNnzO.jpg
Metasploit中,“msfrop”工具将搜索给定的二进制文件,并返回可用的小工具。
A11Ak0P03T0Tbw1r.jpg
当二进制文件包含数千个小工具时,详细的-v输出就不是特别有用,因此,更为有用的是“-x”,使用这一选项,您可以将结果输出到CSV文件中,然后再进行搜索。
ZovR4LliZMCo4m57.jpg
译者注:ASLR

aslr是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。
ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。据研究表明ASLR可以有效的降低缓冲区溢出攻击的成功率,如今Linux、FreeBSD、Windows等主流操作系统都已采用了该技术。




上一篇:linux shell下的快捷键,简直太有用了!
下一篇:linux shell实用常用命令
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

 

QQ|申请友链|小黑屋|手机版|Hlshell Inc. ( 豫ICP备16002110号-5 )

GMT+8, 2024-5-16 05:00 , Processed in 0.094322 second(s), 47 queries .

HLShell有权修改版权声明内容,如有任何爭議,HLShell將保留最終決定權!

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表