Размещение локальных переменных подпрограммы

Тема в разделе "WASM.BEGINNERS", создана пользователем gpl, 11 апр 2009.

  1. gpl

    gpl New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2009
    Сообщения:
    2
    Собрал тестовый пример
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. main()
    4. {
    5.     char c[5] = { 0, 1, 2, 3, 4 };
    6.     __asm {
    7.         nop
    8.         nop
    9.         nop
    10.     }
    11. }
    компилятором C/C++ из VC++ EE 2008 (без всяких флагов).

    Дизассемблирование секции .text дало следующий результат:
    Код (Text):
    1.   00401000: 55                 push        ebp
    2.   00401001: 8B EC              mov         ebp,esp
    3.   00401003: 83 EC 0C           sub         esp,0Ch
    4.   00401006: A1 00 A0 40 00     mov         eax,dword ptr ds:[0040A000h]
    5.   0040100B: 33 C5              xor         eax,ebp
    6.   0040100D: 89 45 FC           mov         dword ptr [ebp-4],eax
    7.   00401010: C6 45 F4 00        mov         byte ptr [ebp-0Ch],0
    8.   00401014: C6 45 F5 01        mov         byte ptr [ebp-0Bh],1
    9.   00401018: C6 45 F6 02        mov         byte ptr [ebp-0Ah],2
    10.   0040101C: C6 45 F7 03        mov         byte ptr [ebp-9],3
    11.   00401020: C6 45 F8 04        mov         byte ptr [ebp-8],4
    12.   00401024: 90                 nop
    13.   00401025: 90                 nop
    14.   00401026: 90                 nop
    Мне непонятны следующие вещи:
    1) какой смысл выделять для массива из 5 байт 12 байт? Почему не 8?
    2) зачем выполняются 2 операции 00401006-0040100B
    Код (Text):
    1.   00401006: A1 00 A0 40 00     mov         eax,dword ptr ds:[0040A000h]
    2.   0040100B: 33 C5              xor         eax,ebp
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    [0040A000h]
    _security_cookie.

    [ebp-4]
    GSCookie.


    Это способ обнаружения перезаписи адреса возврата в случае переполнения буфера. Если адрес возрата будет перезаписан, то GSCookie тоже перезапишется. Перед выходом из функции происходит проверка GSCookie (вызов _security_check_cookie()).

    /GS-
    Ключ для отключения GSCookie.