在黑客安全圈,基于内存攻击技术的攻击手段也在随着时代的变化而不断发展。内存攻击是指利用软件的安全漏洞构造恶意输入,拒绝服务或远程控制正常程序。第一种内存攻击技术是缓冲区溢出漏洞,现在能广泛使用的高危漏洞(CVE)几乎都属于缓冲区溢出。
首先,读者要了解缓冲区溢出,缓冲区溢出分为栈溢出和堆溢出。这种漏洞的原理是程序对缓冲区边界缺乏理性检测而导致的异常行为。通常,程序有没有严格过滤的输入点。通过这些输入点,攻击者可以向程序写入超过程序员定义的缓冲区边界的内容,从而覆盖相邻的内存区域。它导致程序中的变量被覆盖,甚至控制了CPU中的EIP寄存器指针,从而造成程序的意外行为,而C/C++程序本身缺乏固有的内存安全分配和管理,所以大部分缓冲区溢出漏洞出现在编译语言中。
缓冲区溢出攻击,内存攻击技术还包括以下攻击方法:
• 栈溢出攻击:与缓冲区溢出攻击类似,但是攻击者利用的是程序的栈空间。• 堆溢出攻击:攻击者利用程序中堆的分配方式中存在的漏洞,向堆中写入恶意代码,从而控制程序的执行流程。• 格式化字符串攻击:利用程序对格式化字符串的处理不当,向内存中写入恶意代码。• 内核攻击:利用内核漏洞,攻击内核模块,获取系统权限。• 内存映射文件攻击:攻击者通过访问内存映射文件,可以修改文件的内容,从而导致程序崩溃或执行恶意代码。
这些攻击都可以利用软件的漏洞,从而使程序异常,控制程序的执行过程,进而实现攻击者的恶意目的。为了避免内存攻击,软件开发者需要注意代码的安全性,防止漏洞的发生。
在本章中,我们将具体讨论远程堆栈溢出的挖掘和利用技术。堆栈溢出是缓冲区溢出中最常见的攻击方法。其原理是程序运行时堆栈地址由操作系统维护。当我们调用函数时,程序会将当前函数的下一条指令的地址压入堆栈,函数执行后,通过ret指令从堆栈地址弹出被压入的返回地址。并将返回地址重新载入EIP指令指针寄存器,以便继续运行。但是,将这种控制程序执行流的地址保存到堆栈中,必然会给堆栈溢出攻击带来可行性。
大致搞清楚缓冲区溢出攻击后,我在这里总结一下攻守双方对抗的游戏过程。进攻方和防守方的博弈斗争从来没有停止过,在大环境下防守总是落后于进攻,但无论如何,正是攻守双方的对抗使得系统安全水平螺旋式上升。以下是攻守双方对抗的游戏过程总结:
首先,在目前的环境下,微软的内存保护机制大致可以分为以下几类:
1.堆栈缓冲区溢出检测保护GS(编译器)2。安全结构化异常处理保护安全SEH 3。堆栈SEH覆盖保护SEHOP 4。随机布局保护ASLR 5。堆栈数据执行保护DEP。
5.1.1 GS堆栈缓冲区溢出检测保护
保护机制的实现原理
GS(/GS)是微软针对缓冲区溢出攻击提出的保护机制,称为& # 34;缓冲区安全检查& # 34;,又名& # 34;堆栈缓冲区溢出检测& # 34;。这种保护机制受到编译器的限制。程序在运行时,会检测程序使用的stack 空,以便及早发现缓冲区溢出攻击,并在攻击发生时触发异常处理程序,从而避免攻击成功。
GS保护机制是通过在代码中插入额外的安全校验码来实现的。具体来说,编译器将插入一个名为& # 34;Prolog & # 34还有& # 34;结语& # 34;的代码片段,其中将包含一些额外的堆栈空检测代码。这些检测代码将在调用函数时检测堆栈空是否被篡改。如果检测到异常情况,将触发异常处理程序,从而避免攻击成功。
GS保护机制是微软堆栈检测器概念的具体实现。已经添加到Visual Studio系列的编译器中,默认开启。自WindowsXP以来,操作系统完全支持该选项。GS保护机制可以帮助程序员在编写代码时检测缓冲区溢出漏洞,从而提高程序的安全性。但是,GS保护机制并不是万能的,它只能检测部分缓冲区溢出攻击,而不能检测所有攻击。因此,需要其他安全措施来提高程序的安全性。
如何绕过这种保护?
事实上,GS保护机制并不保护堆栈上存储的SEH异常处理结构。因此,如果可以写入足够的数据来覆盖堆栈上的SEH记录,并在函数结束和检测到Cookie之前触发SEH异常,那么Cookie检查将被绕过,我们构建的异常处理例程将被执行。
Seh(结构化异常处理)是Windows操作系统提供的一种异常处理机制,类似于C++中的try-catch语句,用于处理程序中的异常情况。在Windows操作系统中,SEH信息存储在堆栈上,因此可以用来进行缓冲区溢出攻击。
SEH覆盖攻击的基本思想是利用缓冲区溢出漏洞将恶意代码写入SEH记录,从而覆盖SEH处理程序的返回地址,控制程序的执行流程。攻击者可以修改SEH记录中的指针,将其指向自己构建的恶意代码,从而实现任意代码执行。因为GS保护机制不保护堆栈上存储的SEH异常处理结构,所以攻击者可以利用这一点绕过Cookie检查并执行恶意代码。
为了防止SEH覆盖攻击,可以采取一些措施来加强程序的安全性。例如,您可以使用安全的编程实践,如输入验证、缓冲区长度检查等。,以防止缓冲区溢出漏洞。此外,我们还可以使用一些防御措施,比如使用堆栈保护技术(如GS、ASLR、DEP等。),并使用代码审计、反汇编等技术查找和修复漏洞。这些措施可以有效地防止SEH覆盖攻击和其他类型的缓冲区溢出攻击。
5.1.2 SafeSEH安全结构化异常处理保护
保护机制的实现原理
GS保护的缺陷是可以通过覆盖SEH结构绕过,然后防御者在其编译器中加入了安全SEH保护措施。这个选项需要在链接时添加linker/safesh:yes来打开,并使用SEH句柄验证技术来验证栈中SEH的合法性,以保证SEH结构不会被非法覆盖。
SafeSEH是微软Windows操作系统提供的一种安全机制,用于检测和防止针对SEH异常处理结构的攻击。它通过验证SEH处理程序是否在受信任的SEH链表中来保护它免受SEH覆盖攻击。
当SafeSEH被启用时,程序将在运行时验证SEH处理程序是否在可信SEH链表中,如果不在,将终止程序的执行。要启用SafeSEH保护,您需要在编译和链接期间进行相应的设置。在Visual Studio中,可以使用/SafeSEH编译器选项和/link /safeseh链接器选项来启用SafeSEH保护。
使用SafeSEH保护可以有效防止SEH覆盖攻击。然而,一些攻击者可能会使用其他技术来绕过SafeSEH保护,例如ROP(面向返回的编程)技术来构造设计良好的代码片段,以避免触发SafeSEH保护。因此,在设计安全应用时,要综合考虑多种防御措施,而不是只依赖单一的防御措施。
如何绕过这种保护?
为了突破SefeSEH的保护,攻击者找到了绕过它的新方法。通过使用进程中未启用的SEH模块,修改后的SEH例程指针指向这些模块中的(POP/RET)等一些跳板指令,从而跳转到堆栈执行外壳代码。另外可以把恶意代码放在堆里,然后修改函数指针指向堆,也可以绕过。
一种利用非活动SEH模块绕过safeSEH保护机制的方法。攻击者可以通过将恶意代码写入堆中,然后修改函数指针以指向堆中的代码,跳转到恶意代码执行。此外,攻击者可以使用一些跳板指令(如POP/RET指令)来绕过SafeSEH保护,因为这些指令不被视为SEH处理程序。
为了防止这种攻击,可以在堆上实现堆随机化和地址空随机化(ASLR)。堆随机化可以使恶意代码很难找到并使用堆中的内存地址,从而使攻击者更加困难。地址空之间的随机化可以随机化代码段、数据段、堆栈等内存区域的基址,从而增加攻击者的难度。此外,还可以使用代码签名等技术来验证代码的完整性和来源,从而保证代码的可信度。
5.1.3 SEHOP堆栈SEH覆盖保护
保护机制的实现原理
随后,防御者进一步提出了SEHOP技术,该技术从Windows Vista默认支持,在Win7-Win8系统上默认关闭该技术。您可以通过注册表打开此选项。该技术的核心原理是在程序运行时验证整个异常处理链表结构的完整性。如果攻击者重写异常处理程序,链表将被破坏,从而抛出异常停止执行。
SEHOP(SEH覆盖保护)技术是微软在Windows Vista中推出的一项增强保护措施,旨在提高SEH处理程序的安全性。SEHOP验证整个异常处理链表的完整性,防止攻击者通过覆盖单个SEH处理程序来破坏整个链表,从而使SEH处理程序难以被利用。
SEHOP的原理是在程序运行时验证异常处理链表,从而保证链表中每个异常处理程序的指针都指向一个有效的代码段,保证链表中的每个元素都按照指定的顺序排列。如果检测到异常处理链表被破坏,SEHOP会立即抛出异常,停止程序的执行。
如何绕过这种保护?
为了绕过SEHOP保护机制,突破方法是进一步伪造SEH链。这个方法的核心是找到一个合适的跳板指令,伪造的最终异常处理程序指针应该和真实的一样。伪造的最终异常处理程序指针(SEH链指针)的前4个字节应该是0xFFFFFFFF,SEH链指针地址应该能被4整除。
需要补充的是,虽然伪造SEH链可以绕过SEHOP的保护,但这种攻击方式需要知道目标程序的具体结构和代码实现,因此其适用范围有限,同时也要求攻击者具备一定的技术水平和经验。同时,使用SEHOP技术仍然可以有效地提高系统的安全性。
5.1.4 ASLR地址布局随机化保护
保护机制的实现原理
如上所述,我们需要找到一个合适的跳板指令,但恰好防御者在此基础上增加了一项新技术,即ASLR地址空之间的布局随机化。该技术的核心原理是防止攻击者预测内存中排列的ShellCode的内存地址,因此即使发生溢出并成功填充内存,攻击者也无法知道从哪里跳转EIP指针,从而无法执行恶意代码。
Aslr(地址空间布局随机化)是一种内存随机化技术。它使程序每次运行时的代码、数据、堆栈等内存空之间的布局随机化,使攻击者难以准确预测代码和数据的位置,从而防止针对特定内存地址的攻击。这种技术通常在操作系统内核中实现,每个进程使用不同的随机偏移量来布局内存空,防止攻击者利用事先获取的内存地址进行攻击。同时,ASLR技术还可以增加攻击者所需的时间和资源,因为攻击者需要在每次攻击前重新计算内存地址的位置。
ASLR技术可以在一定程度上提高系统的安全性,但也存在一些绕过它的攻击技术,比如通过泄露内存地址,利用内存泄漏漏洞获取目标内存的地址,从而绕过ASLR的保护。因此,在使用ASLR技术的同时,有必要结合其他安全措施来提高系统的安全性。
如何绕过这种保护?
对于ASLR技术,攻击者也找到了一种绕过它的方法,主要是利用堆喷技术,通过脚本语言在堆上排列大量包含ShellCode代码的指令块,从而提高指令块中某个内存地址的命中率,通过执行概率击败ASLR技术。
5.1.5 DEP堆栈数据执行保护
保护机制的实现原理
DEP的保护直接一针见血的解决了缓冲区溢出的问题。数据执行保护将程序数据段所在的内存页(栈)的属性强制设置为NX(不可执行)。当程序执行这些内存页面上的数据时,它会报告一个错误并禁止文件的执行。今天的CPU提供硬件安全保护,也支持DEP保护技术。
DEP(Data Execution Prevention)是一种软硬件结合的保护机制,旨在防止攻击者利用缓冲区溢出等漏洞执行恶意代码。它通过将内存中的数据区域(如堆、堆栈和可执行代码)标记为可执行或不可执行来保护它们。
当攻击者试图在不可执行的内存区域运行代码时,DEP机制将触发异常,这将导致程序崩溃或被终止。这种保护机制可以有效防止攻击者利用缓冲区溢出等漏洞执行恶意代码,从而提高系统的安全性。
如何绕过这种保护?
为了绕过DEP保护,攻击者提出了一种新的绕过方法ROP(ret Oriented Programming),它是ret2libc的后继者。在程序溢出后,攻击者并不执行堆栈中的外壳代码,而是寻找程序中加载的特殊指令块,将这些相对孤立的指令串联起来形成一条链,并调用VirtualProtect函数将堆栈设置为可执行属性,然后在。
原文地址
https://www.lyshark.com/post/48aa93e.html