这篇文章是去年为某公司的面试准备的,虽然最终没有被录用,但是在这过程中收获很多,总结出这篇文章与大家分享。对于逆向分析我纯属于爱好者水平,而且之前主要以Android smali为主,对Win32经验并不多,文章中大部分内容都是现学现卖,最终没有被录用的原因是还有一个重要的地方我没有分析出来。不过以我有限的经验,无法再继续,在此也希望有大神指点一二,不胜感激!!


360出的XP盾甲,为Windows XP实现了Vista以上版本才有的ASLR机制,这个机制会使绝大多数溢出类漏洞失效或难以利用。这也是为什么360这么自信的宣传360盾甲。下面是我对此机制实现过程的逆向分析,看看360用了什么黑科技搞定这件事情的。

什么是ASLR?

对溢出类漏洞的攻击,会用到许多系统共享库,在XP及之前的系统,这些共享库的内存地址是固定的。构造溢出代码时,可以很方便的调用这些共享库的API。例如:LoadLibrary函数在XP下地址是0x7C80AEEB,直接调用即可。当然还有其它的漏洞利用方式,但几乎都必须依靠固定的地址实现。ASLR全称是Address Space Layout Randomization(地址空间布局随机化)。它通过随机化共享库的加载地址,使以上攻击失效或难以利用。

ASLR的效果

这里我写了一小段程序ASLRTest,用来输出各个库的加载地址。输出结果如下:

未使用XP盾甲:

Ntdll的加载地址:7C920000
Kernel32的加载地址:7C800000
LoadLibrary函数的地址:7C80AEEB
MSVCR120.dll的加载地址:10000000
system函数的地址:100808C2
本程序customFunc函数的地址:00401000
按任意键继续。

使用XP盾甲后:

Ntdll的加载地址:77040000
Kernel32的加载地址:76CD0000
LoadLibrary函数的地址:76CDAEEB
MSVCR120.dll的加载地址:6BEB0000
system函数的地址:6BF308C2
本程序customFunc函数的地址:00401000
按任意键继续。

继续阅读