Локальные переменные в дизассемблере IDA

Тема в разделе "WASM.BEGINNERS", создана пользователем Arman, 16 май 2008.

  1. Arman

    Arman New Member

    Публикаций:
    0
    Регистрация:
    13 май 2008
    Сообщения:
    13
    Есть программа следующего содержания:
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. main()
    4. {
    5.     int* yPtr;
    6.     int y = 5;
    7.     yPtr = &y;
    8.     printf("Address of y: %p\n",&y);
    9.     printf("Value of yPtr: %p\n",yPtr);
    10.     printf("Address of yPtr: %p\n",&yPtr);
    11.     printf("%d %d\n",sizeof(int*),sizeof(int));
    12.     return 0;
    13. }
    Как видно, здесь только две локальные переменные, причем обе они занимают 4 байта, то есть DWORD. Но почему-то IDA кроме них, показывает еще одну, размером с байт.
    Код (Text):
    1. .text:00411A30 var_D8 ; что это такое?
    2. .text:00411A30 var_14 ;это - int y
    3. .text:00411A30 var_8   ; int* yPtr
    4. .text:00411A30
    Вопрос: зачем она нужна?
    У Криса Касперски этот вопрос как-то не затрагивается. (Просмотренные книги: "Образ мышления - дизассемблер IDA" и "Искусство дизассемблирования").
    Прилагаю pdb - файл
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Arman
    Файл не приаттачился (видимо из-за размеров). Проще показать ассемблерный код этой процедуры.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Arman
    сегенрь асм-листинг и посмотри, там можно включить генерацию комментов как правило, или выложи полностью текст main'a. pdb не надо,
     
  4. Arman

    Arman New Member

    Публикаций:
    0
    Регистрация:
    13 май 2008
    Сообщения:
    13
    Вот полный ассемблерный листинг функции main()
    Код (Text):
    1. main        proc near       ; CODE XREF: j_mainj
    2.  
    3. var_D8      = byte ptr -0D8h
    4. var_14      = dword ptr -14h
    5. var_8       = dword ptr -8
    6.  
    7.         push    ebp
    8.         mov ebp, esp
    9.         sub esp, 0D8h
    10.         push    ebx
    11.         push    esi
    12.         push    edi
    13.         lea edi, [ebp+var_D8]
    14.         mov ecx, 36h
    15.         mov eax, 0CCCCCCCCh
    16.         rep stosd
    17.         mov [ebp+var_14], 5
    18.         lea eax, [ebp+var_14]
    19.         mov [ebp+var_8], eax
    20.         lea eax, [ebp+var_14]
    21.         push    eax
    22.         push    offset aAddressOfYP ; "Address of y: %p\n"
    23.         call    j_printf
    24.         add esp, 8
    25.         mov eax, [ebp+var_8]
    26.         push    eax
    27.         push    offset aValueOfYptrP ; "Value of yPtr: %p\n"
    28.         call    j_printf
    29.         add esp, 8
    30.         lea eax, [ebp+var_8]
    31.         push    eax
    32.         push    offset aAddressOfYptrP ; "Address of yPtr: %p\n"
    33.         call    j_printf
    34.         add esp, 8
    35.         push    4
    36.         push    4
    37.         push    offset aDD  ; "%d %d\n"
    38.         call    j_printf
    39.         add esp, 0Ch
    40.         xor eax, eax
    41.         push    edx
    42.         mov ecx, ebp
    43.         push    eax
    44.         lea edx, word_411AC6
    45.         call    j__RTC_CheckStackVars
    46.         pop eax
    47.         pop edx
    48.         pop edi
    49.         pop esi
    50.         pop ebx
    51.         add esp, 0D8h
    52.         cmp ebp, esp
    53.         call    j__RTC_CheckEsp
    54.         mov esp, ebp
    55.         pop ebp
    56.         retn
    57. main        endp
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Arman
    Используется для проверки от всяких buffer overflows imho. С какими ключами собирали? Версия cl?

    P.S. hint:
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
  7. Arman

    Arman New Member

    Публикаций:
    0
    Регистрация:
    13 май 2008
    Сообщения:
    13
    Version 12.00.8168
    в том-то и дело, что без ключей
    см. выше.
     
  8. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Без ключей по умолчанию все оптимизации выключены, все проверки включены.
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    1) Есть такая переменная окружения ENC_CMD Ключи можно в ней задать по другому.
    2) Я привык доверять глазам, а не словам. Взял этот исходник и откомпилил под Интел Си и в МС СИ выдернутом из VS2003NET. Никаких рабочих ячеек и никаких проверок стека.
    3) Ну видно же, что Var_D8 просто указывает на место в стеке, которое затирают CCCCCCCC - защита от сплойтов. А уж почему ключи порылись - это другой вопрос.
     
  10. Arman

    Arman New Member

    Публикаций:
    0
    Регистрация:
    13 май 2008
    Сообщения:
    13
    Здесь можно поподробнее? Или ссылки на эту тему?
     
  11. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Arman
    Ну, от сплоитов-не-от-сплоитов, но суть в том, что при компиляции дебажной версии программы данный компилятор заполняет выделенную под локальные переменные память этими байтами (0xCC). Лайк, меньше неопределённости - проще отладка.
     
  12. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    0CCh - это int3
    Это на случай если вдруг управление будет передано на данные, сработает отладочное прерывание для вылавливания таких случаев.
    То что код компилировался в Debug - это 100%
     
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Arman
    Какие ссылки : ты хоть раз в экзешник от Вижуала глядел. Для выравнивания всегда заполняют CC.
    Я когда первый раз увидел - испугался : думаю крутая защита, все INT 3 заполнено. А оказывается это просто прием такой, чтобы при ошибках прога не могла далеко уйти. На стеке ссылок на сам стек тоже тьма, т.ч. return запросто может в стек пойти. Поэтому заполняя стек ССССССС защищаемся слегка от ошибок, ну и параллельно от переполнения буфера, наверное. Лень анализировать, но думаю и еще пару "полезностей" можно найти.
     
  14. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533