ASLR (Address Space Layout Randomization)
解决方法 总结:
1 利用 未启用ASLR的模块的跳转 ,直接覆盖返回地址,!ASLRdynamicbase 查看未启用ASLR的模块中的跳转地址
注意输出并不可信,重启比较较好
2 基于SEH的exploit 那么
!pvefindaddr nosafeseh 搜索没safeseh保护
!pvefindaddr nosafesehaslr 搜索 safeseh和aslr都没启用的模块
注意输出并不可信,重启比较较好
然后例如 !pvefindaddr p esi xxxx.dll 寻找 pop pop ret
3 部分覆盖进行定位内存地址 只用于memcpy等不截断字符串覆盖低字节
通过加载程序时候不再使用固定的基址加载,从而干扰shellcode定位的一种保护机制
windows Vista出现后,ASLR 才真正开始发挥作用
VS2005 添加 /dynmicbase 就可以支持 ASLR
VS2008 linker->Randomized Base Address 设置
包含 映像随机化,堆栈随机化,PEB+TEB随机化
百度下:
ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。据研究表明ASLR可以有效的降低缓冲区溢出攻击的成功率,如今Linux、FreeBSD、Windows等主流操作系统都已采用了该技术。
PE头文件中会设置 IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE标示来说明其支持 ASLR
1 映像随机化
经典的方法是用注册表项HKLMSYSTEMCurrentControlSetSession ManagerMemory Management.的方法对映像随机化禁用 设置为0 禁用 ,-1强制对可随机化的映像进行处理,其他值正常工作
各模块的低位2位不变
只是对加载基址的前2个字节做了随机处理
2 堆栈随机化
XP 下 不具备, VISTA具备 每次获取堆地址不同
不需要精确跳转的 溢出手段影响有限
3 PEB TEB随机化
XP SP2中已经引入了,使用随机性的基址.
提取代码:
unsigned int teb; unsigned int peb; __asm { mov eax,fs:[0x18] mov teb,eax mov eax,dword ptr [eax+0x30 mov teb,eax] } printf("PEB:%#x TEB:%#x",peb,teb); getchar();
ADOBE FLASH PLAYER ACTIVEX 在10后的版本开始全面支持 微软的安全特性,但10以前的可能并未支持SAFESEH ASLR
根据 http://en.wikipedia.org/wiki/Address_space_layout_randomization所述,在win7下,要用官方指定工具(The Enhanced Mitigation Experience Toolkit)禁用:
http://support.microsoft.com/kb/2458544