понедельник, 9 сентября 2013 г.

Лулзный крэш в CL от Visual Studio 2012 от одной строчки кода :)



Лулзный крэш в CL от Visual Studio 2012.. Причиной которой являеться __if_exists. (http://msdn.microsoft.com/en-us/library/x7wy9xh3.aspx) Промах в токене. Так что теоритически возможна "эксплотация при компиляции" . Что значит исходной код на С++ может получить управление во время компиляции. Что весьма доставляет. В даном случае в нем нет смысла(быстрый анализ) из таблицы получает(массива) нолувой указатель, что приводит к крэшу.

c1xx!TokenStreamStack::getToken+0x37:
55e46237 41              inc     ecx
55e46238 8b348e          mov     esi,dword ptr [esi+ecx*4]
55e4623b 89481c          mov     dword ptr [eax+1Ch],ecx
55e4623e 8b06            mov     eax,dword ptr [esi] // crash: esi == null
55e46240 3d20020000      cmp     eax,220h
55e46245 7f2a            jg      c1xx!TokenStreamStack::getToken+0x71 (55e46271)
55e46247 5f              pop     edi
55e46248 8bc6            mov     eax,esi

CallStack
0:000> k
ChildEBP RetAddr 
002ce240 55ea24fe c1xx!TokenStreamStack::getToken+0x3e
002ce260 55e45e2f c1xx!LexerHandleIfExists+0x1ee
002ce280 55e653cc c1xx!yylex+0x7ef
002ce298 55df2734 c1xx!DeclarationParser::Parse+0x25c
002ce30c 55e3e9bc c1xx!CallDisambigParser+0x434
002ce328 55e48655 c1xx!DisambiguateCtor+0xac
002ce694 55df5226 c1xx!PrimaryParser::Parse+0x1e85
002ce710 55e530db c1xx!CallPrimaryParser+0xf6
002cea70 55e52a15 c1xx!main_compile+0x1bb
002ceaa8 55e51354 c1xx!Trap_main_compile+0x15
002cead0 55e5128e c1xx!CallMain+0x94
002ceb08 55e51181 c1xx!Trap_CallMain+0x1e
002ceb24 00e3e0fd c1xx!InvokeCompilerPassW+0x41
002ceb84 00e3e2f1 cl!execute+0x15d
002cebc0 00e3de25 cl!dopass+0xe1
002cebd8 00e4159a cl!passes+0x40
002cf414 00e44664 cl!compile_worklist+0x2fb
002cfc50 00e42b9b cl!compile+0xe4
002cfd78 00e45b67 cl!wmain+0x4ab
002cfdb8 759633aa cl!_wsetargv+0x232
002cfdc4 77a79f72 kernel32!BaseThreadInitThunk+0xe
002cfe04 77a79f45 ntdll!__RtlUserThreadStart+0x70
002cfe1c 00000000 ntdll!_RtlUserThreadStart+0x1b

"Главный достовлятор" - это что крэш возникает при компиляции одной строчки кода.
class A { A(__if_exists(B){} ) {;} }; void main() { }

Интерестно это так же тем что 16 лет спустя(с Visual Studio 97), а "детские ошибки" таки остались...

Комментариев нет:

Отправить комментарий