Windows安全机制---地址随机化:ASLR机制

文章目录

      • Windows安全机制
      • 地址随机化:ASLR机制
        • 原理
          • 映像随机化
          • 堆栈随机化
          • PEB与TEB随机化
        • 绕过
          • 攻击未启用ASLR的模块
          • 利用部分覆盖进行定位内存地址
          • 利用Heap spray进行内存地址定位
          • 利用Java applet heap spray定位内存地址
          • 为.net控件禁用ASLR

Windows安全机制

微软关于内存保护机制

  1. GS编译技术
  2. SEH的安全校验机制
  3. Heap Cookie,Safe Unlinking等一系列堆安全机制
  4. DEP数据执行保护
  5. ASLR加载地址随机
  6. SEHOP SEH的覆盖保护`

地址随机化:ASLR机制

原理

地址随机化需要程序自身和操作系统的双重支持,会在PE头中设置IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE标识来说明支持ASLR。
Windows安全机制---地址随机化:ASLR机制_第1张图片
编译器可以在这里设置,其中地址随机化包含了映像随机化,堆栈随机化,PEB与TEB随机化

映像随机化

在PE文件映射到内存时,对加载虚拟地址进行随机化处理,系统重启这个地址是变化的。
出于兼容性考虑,这个选项也可以通过注册表关闭
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\MoveImages
当为-1时,强制随机化
Windows安全机制---地址随机化:ASLR机制_第2张图片
当没有时可以新建

堆栈随机化

堆栈的基址是打开程序的时候确定的,同一个程序任意两次运行时的堆栈基址是不同的。

PEB与TEB随机化

微软在xp sp2之后不再使用固定的PEB基址0x7FFDF000和TEB基址0x7FFDE00

mov eax,FS:[0x18]
mov teb,eax
mov eax,dword ptr[eax+0x30]
mov peb,eax

这样也可以快速确定TEB和PEB的地址

绕过

对于映像随机化,虽然模块的加载地址变了,但低2个字节不变。
对于ASLR堆栈随机化,可以使用JMP esp和heap spray等绕过限制
对于PEB和TEB的随机化,也是可以通过FS的偏移来定位的

攻击未启用ASLR的模块

Flash Player ActiveX9.0.262是没有开启ASLR模块的。Flash9k.ocx的加载基址是固定的。
环境要求Windows Vista SP0

利用部分覆盖进行定位内存地址

Windows安全机制---地址随机化:ASLR机制_第3张图片
只覆盖返回地址的低2位,因为高两位会变。注意到eax的值正好是shellcode的起始位置,所以我们可以在返回地址处覆盖一个jmp/call eax
在这个模块中搜索指令jmp/call eax,地址为00401430,其中高两位0040会变,而1430不会变。所以把返回地址的低两位覆盖为1430即可。

但是成功跳转到shellcode位置,shellcode确未成功执行。

利用Heap spray进行内存地址定位
利用Java applet heap spray定位内存地址
为.net控件禁用ASLR

你可能感兴趣的:(二进制漏洞)