文章目录
Windows安全机制
微软关于内存保护机制
- GS编译技术
- SEH的安全校验机制
- Heap Cookie,Safe Unlinking等一系列堆安全机制
- DEP数据执行保护
- ASLR加载地址随机
- SEHOP SEH的覆盖保护`
地址随机化:ASLR机制
原理
地址随机化需要程序自身和操作系统的双重支持,会在PE头中设置IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE标识来说明支持ASLR。
编译器可以在这里设置,其中地址随机化包含了映像随机化,堆栈随机化,PEB与TEB随机化
映像随机化
在PE文件映射到内存时,对加载虚拟地址进行随机化处理,系统重启这个地址是变化的。
出于兼容性考虑,这个选项也可以通过注册表关闭
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\MoveImages
当为-1时,强制随机化
当没有时可以新建
堆栈随机化
堆栈的基址是打开程序的时候确定的,同一个程序任意两次运行时的堆栈基址是不同的。
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
利用部分覆盖进行定位内存地址
只覆盖返回地址的低2位,因为高两位会变。注意到eax的值正好是shellcode的起始位置,所以我们可以在返回地址处覆盖一个jmp/call eax
在这个模块中搜索指令jmp/call eax,地址为00401430,其中高两位0040会变,而1430不会变。所以把返回地址的低两位覆盖为1430即可。
但是成功跳转到shellcode位置,shellcode确未成功执行。