резервирование памяти cpp+ida

Тема в разделе "WASM.BEGINNERS", создана пользователем 10ton, 16 янв 2010.

  1. 10ton

    10ton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    32
    void func()
    {
    char buf[5];

    printf("enter buff: ");
    ...

    }

    void main()
    {
    func();
    printf("exit...");
    }

    компилю прогу, смотрю в иде func:

    подскажите пожалуйста, почему после вызова func под buf выделяется 0Ch байт а не 08h , ведь по идее должно выделяться ближайшее значение кратное 4 (т.к. для ускорения доступа к данным компилятор размещает по адресам кратным четырем..) , так ведь?
    получается это компилятор так сделал? почему он посчитал все-таки не 8 а C зачем он так много выделил?
     
  2. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Выложи код который показала ида.
     
  3. 10ton

    10ton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    32
    Код (Text):
    1. .text:00401000 sub_401000      proc near               ; CODE XREF: sub_401050+3p
    2. .text:00401000
    3. .text:00401000 var_C           = byte ptr -0Ch
    4. .text:00401000 var_4           = dword ptr -4
    5. .text:00401000
    6. .text:00401000                 push    ebp
    7. .text:00401001                 mov     ebp, esp
    8. .text:00401003                 sub     esp, 0Ch
    9. .text:00401006                 mov     eax, dword_40D000
    10. .text:0040100B                 xor     eax, ebp
    11. .text:0040100D                 mov     [ebp+var_4], eax
    12. .text:00401010                 push    offset aEnterBuff ; "enter buff: "
    13. .text:00401015                 call    sub_401295
    14. .text:0040101A                 add     esp, 4
    15. .text:0040101D                 push    offset aHyi     ; "hyi: "
    16. .text:00401022                 call    sub_401295
    17. .text:00401027                 add     esp, 4
    18. .text:0040102A                 lea     eax, [ebp+var_C]
    19. .text:0040102D                 push    eax
    20. .text:0040102E                 call    sub_40127F
    21. .text:00401033                 add     esp, 4
    22. .text:00401036                 mov     ecx, [ebp+var_4]
    23. .text:00401039                 xor     ecx, ebp
    24. .text:0040103B                 call    sub_40135A
    25. .text:00401040                 mov     esp, ebp
    26. .text:00401042                 pop     ebp
    27. .text:00401043                 retn
    28. .text:00401043 sub_401000      endp
     
  4. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    От var_C до var_4 как раз ровно 8 байт.
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Код (Text):
    1. ; установка кукиса
    2. .text:00401006                 mov     eax, dword_40D000  ; mov eax, [_security_cookie]
    3. .text:0040100B                 xor     eax, ebp
    4. .text:0040100D                 mov     [ebp+var_4], eax
    5.  
    6. ; проверка кукиса
    7. .text:00401036                 mov     ecx, [ebp+var_4]
    8. .text:00401039                 xor     ecx, ebp
    9. .text:0040103B                 call    sub_40135A         ; call __security_check_cookie
    Ключевые слова: /GS, _security_cookie, __security_check_cookie.
     
  6. 10ton

    10ton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    32
    Sol_Ksacap
    про кукисы спасибо большое за информацию, я так понял это защита функции от переполнения буфера средствами компилятора

    только вот даже без функции, в моем случае это gets()(.text:0040102E call sub_40127F
    ), прога выделяет все равно 0Сh байт под буфер
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Имеешь в виду, что даже если убрать вызов функции gets(), компилятор всё равно вставит gs-кукис? Т.е. интересует алгоритм, по которому vc вставляет подобную защиту? VC Team Blog on GS cookies – описано текущее положение (vc9) и будущее (vc10). Если интересует, как можно эту защиту отключить, то можно воспользовать ключ "/GS-". Если же мы неверно распарсили пост и имелось в виду что-то другое, то желательно переформулировать и выложить дизасм-листинг.
     
  8. 10ton

    10ton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    32
    не так выразился)
    имею ввиду то что если убрать gets() то кукисов нет - это очевидно (уже), т.к. нечего защищащать, с ключом /GS разобрался, это кстати интересная штука, можно использовать уязвимые функции а компилятор сам защитит все переполнения вставив кукисы...

    я имел ввиду что в функции:

    void func() { char buf[5]; }

    памяти выделяется 0Ch именно под буфер размером 5, это просто особенность такая компилятора?
    а так же если buf[2000] то выделяется 7D8 что равно 2008 , т.е на 8 байт больше, чем размер буфера
    просто насколько мне известно из умных книг) размер выделяемой памяти должен быть кратен четырем естественно в большую сторону, т.е. когда я вижу буфер скажем размера 7D8 в IDA, то не имея исходника я предполагаю что программист задавал буфер размер которого в пределах 7D5..7D8 - и это абсолютно неверно!, и получается что размер буфера на самом деле был 7D0 :)
     
  9. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Может и особенность. У нас такой особенности не замечено хотя.

    Код (Text):
    1. C:\Users\Mal\Desktop>type test.cpp
    2. void DoBuf(char*);
    3.  
    4. void func5()
    5. {
    6.         char buf[5];
    7.         DoBuf(buf);
    8. }
    9.  
    10. void func2000()
    11. {
    12.         char buf[2000];
    13.         DoBuf(buf);
    14. }
    15. C:\Users\Mal\Desktop>cl /Ox /c /GS- test.cpp
    16. Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
    17. Copyright (C) Microsoft Corporation.  All rights reserved.
    18.  
    19. test.cpp
    20.  
    21. C:\Users\Mal\Desktop>dumpbin /disasm test.obj
    22. Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
    23. Copyright (C) Microsoft Corporation.  All rights reserved.
    24.  
    25.  
    26. Dump of file test.obj
    27.  
    28. File Type: COFF OBJECT
    29.  
    30. ?func5@@YAXXZ (void __cdecl func5(void)):
    31.   00000000: 83 EC 08           sub         esp,8
    32.   00000003: 8D 04 24           lea         eax,[esp]
    33.   00000006: 50                 push        eax
    34.   00000007: E8 00 00 00 00     call        ?DoBuf@@YAXPAD@Z
    35.   0000000C: 83 C4 0C           add         esp,0Ch
    36.   0000000F: C3                 ret
    37. ?func2000@@YAXXZ (void __cdecl func2000(void)):
    38.   00000010: 81 EC D0 07 00 00  sub         esp,7D0h
    39.   00000016: 8D 04 24           lea         eax,[esp]
    40.   00000019: 50                 push        eax
    41.   0000001A: E8 00 00 00 00     call        ?DoBuf@@YAXPAD@Z
    42.   0000001F: 81 C4 D4 07 00 00  add         esp,7D4h
    43.   00000025: C3                 ret
     
  10. 10ton

    10ton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    32
    а у меня подругому во втором случае

    Код (Text):
    1. void func()
    2. {
    3.     char buf[2000];
    4.    
    5.     printf("enter buff: ");
    6.     gets(buf);
    7. }
    8.  
    9. cl /I "d:\Program Files\Microsoft Visual Studio 9.0\VC\Include" /I "D:\Program Files\Microsoft SDKs\Windows\v6.0A\Include" /c /GS- %1.cpp
    10.  
    11. 00401000  /$ 55             PUSH EBP
    12. 00401001  |. 8BEC           MOV EBP,ESP
    13. 00401003  |. 81EC D0070000  SUB ESP,7D0
    14. 00401009  |. 68 50B14000    PUSH func.0040B150                   ;  ASCII "enter buff: "
    15. 0040100E  |. E8 62020000    CALL func.00401275
    16. 00401013  |. 83C4 04        ADD ESP,4
    17. 00401016  |. 8D85 30F8FFFF  LEA EAX,DWORD PTR SS:[EBP-7D0]
    18. 0040101C  |. 50             PUSH EAX                                 ; /Arg1
    19. 0040101D  |. E8 3D020000    CALL func.0040125F                   ; \func.0040125F
    20. 00401022  |. 83C4 04        ADD ESP,4
    21. 00401025  |. 8BE5           MOV ESP,EBP
    22. 00401027  |. 5D             POP EBP
    23. 00401028  \. C3             RETN
    а если компилировать без /GS-

    Код (Text):
    1. 00401000  /$ 55             PUSH EBP
    2. 00401001  |. 8BEC           MOV EBP,ESP
    3. 00401003  |. 81EC D8070000  SUB ESP,7D8
    4. 00401009  |. A1 00D04000    MOV EAX,DWORD PTR DS:[40D000]
    5. 0040100E  |. 33C5           XOR EAX,EBP
    6. 00401010  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
    7. 00401013  |. 68 50B14000    PUSH func.0040B150                   ;  ASCII "enter buff: "
    8. 00401018  |. E8 68020000    CALL func.00401285
    9. 0040101D  |. 83C4 04        ADD ESP,4
    10. 00401020  |. 8D85 28F8FFFF  LEA EAX,DWORD PTR SS:[EBP-7D8]
    11. 00401026  |. 50             PUSH EAX                                 ; /Arg1
    12. 00401027  |. E8 43020000    CALL func.0040126F                   ; \func.0040126F
    13. 0040102C  |. 83C4 04        ADD ESP,4
    14. 0040102F  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
    15. 00401032  |. 33CD           XOR ECX,EBP
    16. 00401034  |. E8 11030000    CALL func.0040134A
    17. 00401039  |. 8BE5           MOV ESP,EBP
    18. 0040103B  |. 5D             POP EBP
    19. 0040103C  \. C3             RETN
    вообщем лишние 8 байт в данном случае из-за ключа GS )