程序保护机制

  • 系统内存保护

    1. 基于栈的缓冲区溢出检测(GS/Canary)

    我们首先来介绍基于栈的缓冲区溢出检测(GS)的实现,这个机制的本质思想是在缓冲区溢出导致的覆盖位置设置一个标签值,该值具体位于所保存的EBP和RETN(EIP)地址的上方,当从函数返回时会检查这个标签值,看其是否被修改。由于其位于EBP上方,因此一档该值修改,则可以判定RETN也被修改,即发生了缓冲区溢出攻击。新的函数开场白如下:

    push ebp
    mov ebp, esp
    sub esp, 24h    ;这三步同正常的开场白一致
    move ax, dword ptr [vuln!_security_cookie]
    xor eax, ebp    ;xor cookie with ebp
    mov dword ptr [ebp - 4] 

    而对应的函数收场白也添加了cookie值的验证:

    mov ecx, dword ptr [ebp - 4]
    xor ecx, ebp    ;if cookie or ebp changed
    call vuln!_security_check_cookie(004012e8)
    leave
    ret 

    其实就是将安全cookie同ebp进行异或运算后存放在栈上,然后函数返回的时候取出安全cookie,再次与ebp进行异或测试是否同系统值匹配。一种改进是在这个基础上添加了一份参数副本,从而使得原始函数参数即使被覆盖也没用,具体结构如下:

    2. SafeSEH

    SafeSEH主要是对SEH结构的保护机制,防止覆盖和使用存储在栈上的SEH结构。在触发异常时SafeSEH会进行以下几项检查:

    • 确保异常记录位于当前线程的栈上;
    • 确保处理程序指针没有回指栈;
    • 确保处理程序已经在授权处理程序列表中登记;
    • 确保处理程序位于可执行的内存映像中;

    3. 堆保护(NX)

     

    传统的堆漏洞攻击会覆盖对块首部,并视图创建一个伪造的块,当内存释放例程执行时可以使用该块在任意内存地址处写入任意4个字节。具体为:

    • 安全移除:在进行移除前,操作系统会验证向前和向后指针指向的相同的块;
    • 堆元数据cookie:在堆块首部存储一个1字节的cookie,当从空闲列表中移除之前先检查该值。Vista中在几个关键首部字段增加了XOR加密措施,并在使用前进行检查,以防止篡改。

    4. DEP(NX)

    DEP(Data Execution Prevention),即数据执行保护,阻止存放在堆、栈或数据内存中的代码执行,这一直以来都是安全操作系统设计的目标。2004年AMD在其CPU中提供了NX位,首次允许硬件识别内存页是否可执行并采取相应措施。Intel后来推出来了XD功能,实现了类似的功能。

    5. ASLR

    ASLR(Address Space Layout Randomization),即地址空间随机化,思想时在进程使用的内存地址引入随机性,这样会使得攻击变得更加艰难。一些随机化有:

    • 可执行映像采取255个随机位置之一;
    • DLL映像中,ntdll.dll随机加载到256个随机位置之一,然后其他的DLL文件随机加载到另一个随机位置;
    • 栈:比其他内存区更加随机化;
    • 堆:基本堆结构位于32个随机位置之一;
    • PEB(Process Enviroment Block,进程环境块)/TEB(Thread Enviroment Block,线程环境块)

    但是应该注意到,由于Windows系统64KB内存页的限制,因此内存地址随机化时其中一些内存区的熵值较小,即随机化空间不大,因此可以利用蛮力破解。

原文地址:https://www.cnblogs.com/DeeLMind/p/6827544.html