下午和L大神以及D大神等大神们在OOXX研究院的群聊凉宫的长生,不知怎么就聊到了win7的安全,从UAC聊到了ASLR,大家不禁感叹这个ASLR是个bug啊,更加感叹的是,都是一群做挂很有经验的人啊~


在谈ASLR之前,先来说说缓冲区溢出~缓冲区溢出是利用缓冲区溢出漏洞所进行的攻击行为,缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为堆栈,在各个操作进程之间,指令会被临时储存在堆栈当中,堆栈也会出现缓冲区溢出。PS:原理图我就不画了,就那么点事儿~


但是从vista开始微软有一套叫做ASLR的机制在里面,先科普下什么叫ASLR, ASLR(Address space layout randomization),这是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。


我们正常的缓冲区溢出会怎么做呢?我们先要对着有漏洞的程序的缓冲区写入攻击字符串,然后改写源程序的地址,让程序执行shellcode,然后就可以直接爽了~缓冲区溢出,目前主流方法还是在代码的管理上,要求程序员写出较为安全严谨的代码,包括还有就是对于mallloc溢出的时候修改分配和释放内存的布局~


但是我们会发现程不是每一个程序员都能写出安全严谨的代码,甚至很多看起来很严谨的代码最后都被插入~,所以就有了ASLR出现了,值得注意的是ASLR出现经历了两个阶段,我们先不来追述历史,我们先看看ASLR的基本原理,在传统的内存分配中,地址布局都是固定的,代码区->BSS->堆栈区,这样黑客们很随意就能得到基址,并只要能注入就很容易就溢出了~ASLR恰恰就是这种方式的终结者,它通过对堆、栈、dll线性区布局的随机化,达到因为找不到合法的返回地址而不能顺利入侵~


vista以后微软开始使用了ASLR~地址间分布随机化的组件把扩了可执行程序的映像、堆、栈、进程环境块、线程环境块。以可执行程序的映像随机化为例,它的随机化的过程是,首先以PE文件头ImageBase字段为基础,对偏移值做一次加减,并且该偏移值是由一个8-bitdelta乘以影响内存对齐单位而决定的,影响地址在内存的对齐单位是64K,所以一项地址的税基地址范围在16M之类,并且规定delta的值不为0,但是到了windwos 7的时候偏移值的范围已近冲0x010000到了0xfe0000,每一个偏移量值均有1/25的机会被选中。但是需要值得注意的是Vista以后的系统包括到现在Windows8均默认启用ASRL,那么可执行程序和DLL文件在加载的时候都会被加载到随机位置,而且如果自定义程序需要开启ASLR功能必须使用VS2005 SP1以上的编译器用/dynamicbase,在编译的时候会自动开启ASLR技术。


ASLR看起来貌似很厉害,但是真的做得到很安全么?做安全有句话叫没有绝对的安全,这在ASLR技术也是适用的。我们前面已近说了ASLR的原理,那么至少我们在理想状态下是可以攻破的,针对ASLR的随机性,我们首先想到的应该就是暴力破解,虽然没有什么优雅感,但是毋庸置疑暴力破解是最有可能接近真相的途径,我们可以暴力猜测应用程序加载基地址的方法进行攻击,如果我们一旦得到了基地址,那么我们基本上就可以获得程序调用的DLL的地址;还有一种情况,就是如果一个程序存在没有随机化的组件,在Vista中可执行程序和DLL文件只有标志IMAGE_DLL_CHARACTERISICS_DYNAMIC_BASE的情况下才有可能随机化,如果软件开发者忽略或者遗忘了这个,我们通过静态定位组件,理论上应该还是可以绕过ASLR的,然后该怎么玩还怎么玩~


但是这仅仅是理想的状态,真的容易实现么?答案是目前很难做到,首先我们应当考虑到64位系统普及度越来越大,暴力猜解可能在32位下还能勉强靠着运气来猜取,但是面对64位系统的时候,我们还是束手无策的,毕竟64的地址空间的随机粒度太大,完全是不可想象的,所以就目前而言64位还是相当的安全~

 

6 对 “关于ASLR的一点看法”的想法;

评论被关闭。