这些是我的一些想法。
金丝雀-攻击者可以找出金丝雀的值并将其用于缓冲区注入愚弄堆栈保护程序以防止检测到漏洞
DEP,NX-如果调用
VirtualAlloc(), VirtualProtect()
,攻击者可能会尝试将代码重定向到这些功能,并在他想要的页面上禁用DEP,NX在ASLR上注入任意代码。ASLR-不知道。 ASLR和DEP如何工作?
#1 楼
Canary堆栈Canaries通过修改每个函数的序言和结尾区域来工作,以分别在堆栈中放置和检查值。这样,如果在存储器复制操作期间堆栈缓冲区被覆盖,则在从复制功能返回执行之前会注意到该错误。发生这种情况时,将引发一个异常,该异常将被向上传递回异常处理程序层次结构,直到最终到达操作系统的默认异常处理程序为止。如果可以覆盖堆栈中的现有异常处理程序结构,则可以使其指向您自己的代码。这是一种结构化异常处理(SEH)漏洞,它使您可以完全跳过金丝雀检查。
DEP / NX
DEP和NX本质上将内存中的重要结构标记为不可执行,并在尝试执行这些内存区域时强制执行硬件级异常。这会导致正常的堆栈缓冲区溢出,您可以在其中将
eip
设置为esp+offset
并立即运行shellcode,因为堆栈是不可执行的。绕过DEP和NX需要一个很酷的技巧,称为“面向返回的程序设计”。ROP实质上涉及从程序中找到现有的代码片段(称为小工具)并跳转到它们,以便产生期望的结果。由于代码是合法可执行内存的一部分,因此DEP和NX无关紧要。这些小工具通过堆栈链接在一起,该堆栈包含您的漏洞有效负载。堆栈中的每个条目都对应于下一个ROP小工具的地址。每个小工具都采用
instr1; instr2; instr3; ... instrN; ret
的形式,因此ret
在执行指令后将跳转到堆栈上的下一个地址,从而将小工具链接在一起。为了成功完成一条链,通常会在堆栈上放置其他值,这是由于否则可能会妨碍操作。诀窍是将这些ROP链接在一起,以调用诸如VirtualProtect
之类的内存保护功能,然后将其用于使堆栈可执行,以便您的shellcode可以通过jmp esp
或等效的小工具运行。诸如mona.py
之类的工具可用于生成这些ROP小工具链,或在一般情况下查找ROP小工具。ASLR
有几种方法可以绕过ASLR:
直接RET覆盖-使用ASLR的进程通常仍会加载非ASLR模块,从而使您可以仅通过
jmp esp
运行Shellcode。部分EIP覆盖-仅覆盖EIP的一部分,或使用可靠的信息在堆栈中进行公开以找到真正的EIP,然后使用它来计算目标。不过,我们仍然需要一个非ASLR模块。
NOP喷射-创建大量的NOP,以增加跳入合法内存的机会。困难,但即使所有模块都启用了ASLR,也有可能。如果已打开DEP,则无法使用。
Bruteforce-如果您尝试利用不会导致程序崩溃的漏洞进行利用,则可以暴力破解256个不同的目标地址,直到它起作用为止。
推荐阅读:
Corelan-通过ROP链接DEP
Corelan-绕过堆栈Cookie,SafeSeh,SEHOP,HW DEP和ASLR
ASLR / DEP旁路白皮书(PDF)
评论
精彩的帖子,一个小问题:我从未听说过“ NOP喷雾”一词,但它似乎等同于“ NOP橇”或“ NoOP橇”,它更紧密地描述了滑过介入记忆以达到良好状态的作用。是和您所指的一样,还是有一个细微的区别,使“ NOP喷雾”成为单独的事物?谢谢...
– gowenfawr
2012年9月21日在16:04
是的,NOP喷雾剂和NOP雪橇完全一样。我最近才刚开始玩堆喷,所以我选择了头上的术语。
–多项式
2012年9月21日17:40在
@Polynomial:在这里的答案中:security.stackexchange.com/questions/18556/…您提到了NX的硬件实施。因此,如果通过硬件强制执行NX位,使用ROP(使用VirtualProtect())绕过DEP是否仍然有效?
–sudhacker
2012年9月23日下午16:43
是。 NX位仅提供可执行存储器页面保护标志的硬件实施。在禁用NX的情况下,执行未设置可执行位的页面很简单,因为处理器无法识别差异。启用NX后,您将无法执行不可执行的页面。但是,VirtualProtect会更改页面上的保护标志,因此实际上将其标记为可执行文件,然后CPU将允许该文件。
–多项式
2012年9月23日下午21:22
@Polynomial:它似乎不适用于堆溢出,不是吗?
–user2284570
2015年11月1日23:48
#2 楼
金丝雀和其他挥发物并不能防止溢出。他们只是试图应对发生的溢出的后果。金丝雀试图检测溢出情况,该溢出情况会覆盖堆栈帧中的返回地址。 DEP更进一步,它假定返回地址已被覆盖并遵循,并且限制了执行可能跳转的区域。 ASLR又走了一步:它“拖曳”了允许执行的区域。从历史上看,缓冲区溢出被利用来覆盖堆栈中的返回地址,从而使执行跳入非常多的数据已用于缓冲区溢出。金丝雀试图在跳转之前检测到这种情况,并且DEP用于使堆栈空间不可执行。当堆中的缓冲区溢出时,DEP也可以工作(金丝雀仅用于堆栈缓冲区溢出,但是堆也可以包含缓冲区,并且还可以覆盖敏感数据,例如指向函数的指针-特别是在OOP的情况下)语言,例如C ++)。为了绕过DEP和金丝雀,攻击者已开始寻找允许覆盖功能指针的溢出,以使执行跳入标准的库代码中,该代码必须“在那里”并且必须可执行。这就是发明ASLR的原因:使此类游戏更加困难。仍然可以通过幸运来击败ASLR:由于ASLR必须在不太大的地址空间(通常在32位x86中小于2 GB)内保持页面对齐(x86上为4 kB),因此目标代码可能是(最多一百万)。根据攻击环境和攻击者脚本尝试的频率而定,对于舒适度来说,这个值可能太低。
这里的重要主题是,金丝雀,DEP和ASLR本身不会克服溢出,而是针对传统上已采用的通用溢出利用方法。在任何应用程序中,覆盖非指针数据的溢出都可能像远程shell漏洞一样致命(例如,想象一下,溢出会修改名为“
authenticated_user_name
”的字符串字段)。攻击者和防御者之间的武器竞赛变得过于专业化,在我看来,越来越不明白这一点。通常,最好不要允许溢出发生,即在写入目标缓冲区之外的字节之前阻止/杀死有问题的进程/线程。这几乎是任何体面的编程语言(Java,C#,VB.NET,Python,Ruby,Node.js,OCaml,PHP都会发生的……选择很大)。评论
+1用于解决实际问题(允许溢出发生的编程语言)。您可能要提及的是,许多脚本语言(用Python来看)都具有用C编写的模块,以提高性能,尤其是处理网络的模块(因此可能会发生溢出)
– devnul3
2012年9月27日18:31
@ devnul3:例如,我非常高兴获得zlib的纯python实现。 (由于这种情况,ibm as / 400的大多数安全性概念正在逐渐消失)
–user2284570
2015年11月1日23:44
@ user2284570我更喜欢纯Rust实现。我个人认为,仅出于这个原因,C和C ++已过时。如果C ++核心准则可以创建C ++的有用子集,并且可以通过机械方法证明其没有未定义的行为,则它们可能能够解决此问题。
–黛米
17年2月13日在21:04
@Demi:我说这是因为我需要python。
–user2284570
17年2月13日在22:01
@ user2284570可以向Rust库公开C API。
–黛米
17年2月13日在23:21
#3 楼
基本保护级别是ASLR + DEP。如果您不同时使用这两种保护,则可以使用许多强大的技术来利用缓冲区溢出(例如,面向返回的计算,堆喷射,反复猜测)。例如,仅DEP可以使用面向返回的计算来克服;单独使用ASLR和ASLR可以通过堆喷射和反复尝试来克服。
但是,如果目标同时使用ASLR + DEP,则开发工作将变得更加困难。上面提到的技术不足以击败ASLR + DEP。
ASLR + DEP就像一两次拳打一样,使攻击者的生活更加艰难。
击败ASLR + DEP的组合并非不可能,但它需要更多的技巧。
我最喜欢的击败ASLR + DEP方法的示例在幻灯片平台《解释器利用:指针推断和JIT喷涂》中进行了解释。作者在那里描述了他如何利用Flash中的内存安全错误。尽管存在ASLR + DEP,他还是利用Flash JIT的属性来安排内存,从而使他发起代码注入攻击。回想一下,JIT是即时编译器。它将Flash字节码编译为本地代码。本机代码将存储在内存中的某个位置,Flash JIT将其标记为可执行(尽管DEP)。作者找到了一种生成Flash字节码的方法,该方法在编译时将生成嵌入其恶意Shellcode的字节序列(偏移一个字节)。然后,他使用堆喷涂技术来确保内存中有很多副本。最后,他利用了内存安全性错误,使程序跳至另一个地址。由于使用了ASLR,这就像跳转到一个随机地址,但是许多副本确保了很有可能跳转到他的shellcode中。这样,他绕过了ASLR和DEP,这是一个不错的壮举。
最后一点:值得一提的是,ASLR在64位体系结构上更为有效。在32位体系结构上,通常只需进行多次尝试就可以击败ASLR。在32位平台上,没有足够的自由度来引入足够的随机性,因此,在32位平台上,攻击者通过愚蠢的成功获得成功的机会仍然很高。要获得最强的防御力,请使用64位平台。
评论
我的情况:Canaries,ASLR,NX结合在一起。系统5 abi的长模式。该漏洞发生在堆上分配的溢出数组上。可以执行远程代码吗?
–user2284570
15年11月2日在1:20
@ user2284570,请不要使用评论问一个新问题。也许应该将其作为一个单独的问题提出(但请确保在提出问题之前先进行搜索和研究,然后在问题中展示您的研究内容-有关如何绕过ASLR的文章很多,因此请确保在提出要求和框架之前先阅读标准资源您的问题相应地)。答案可能取决于您所攻击的特定应用程序的细节。
– D.W.
2015年11月2日在5:55
好的,因此,总的来说(为了关注主题),这是否会阻止基于堆溢出的远程代码执行?
–user2284570
2015年11月2日,11:46
@ user2284570,我回答中的所有内容都适用于堆溢出。就像我的回答所说的那样,ASLR + DEP并不总是绝对阻止远程代码执行,但是会使它变得更加困难甚至有时是不可能的。
– D.W.
2015年11月2日在16:44
评论
2014年的这篇论文介绍了一种他们称为“盲返回面向程序设计”(BROP)的技术,该技术类似于ROP,但甚至不需要了解源代码或二进制文件。