Buffer overflow trouble...

Тема в разделе "WASM.BEGINNERS", создана пользователем kensai, 4 июл 2005.

  1. kensai

    kensai New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2005
    Сообщения:
    1
    Адрес:
    Ukraine
    ВинИксПи хом-эдишн. Такая проблема: переполняю буфер в своем бажном приложении, подставляю адрес `FF E4`, и это приложение перепрыгивая на него не "видит" данных, которые находятся по этому адресу. (90945EFE ???) Испробавал штук 20 адресов 01******, 71******, 77******, и т. д. Хотя нашел я эти адреса с помощью сайса. Причем адреса эти время от времени меняются. Кавырялся в кэрнел32.длл, юзер32.длл, мсвцрт.длл но ида не нашла там ничего похожего на `FF E4`.

    Вопрос: как мне найти "постоянные" адреса (FF E4)? Как мне заставить приложение увидить данные хранящиеся по этим адресам?

    Привожу листинг программы:
    Код (Text):
    1. void lame (char* buff)
    2. {
    3.     printf("[+]\tEntering to lame() function\n");
    4.     char small[12];                  
    5.     strcpy(small, buff);
    6. }
    7.  
    8. main(int argc, char **argv)
    9. {
    10.     char str[34];
    11.     printf("[+]\tEntering to Main() function\n");
    12.     char *strprev = "abcdefghijklmnop";
    13.     char *ret = "\xfe\x5e\x94\x90";
    14.     char *strafter = "123456789012";
    15.  
    16.     for(int i = 0, j = 0; i < strlen(strprev); i++, j++)
    17.         str[j] = strprev[i];
    18.     for(i = 0; i < strlen(ret); i++, j++)
    19.         str[j] = ret[i];
    20.     for(i = 0; i < strlen(strafter); i++, j++)
    21.         str[j] = strafter[i];
    22.     lame (str);
    23.     return 0;
    24. }
    25.  


    привожу значения регистров:
    Код (Text):
    1.  EAX = 0012FEE4 EBX = 7FFDF000
    2.  ECX = 0012FF84 EDX = 0012FFC0
    3.  ESI = 00000000 EDI = 0012FF80
    4.  EIP = 90945EFE ESP = 0012FEF8
    5.  EBP = 706F6E6D EFL = 00000246


    пробовал затирать EBP - результат отличался только значением регистров
     
  2. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    Код (Text):
    1.  
    2.  
    3. for(k = 0; k < strlen(ret); k++, j++)
    4. str[j] = ret[k];
    5.  
    6.  




    вот здесь вроде проблема

    тут копируется не адрес возврата , а то что по этому адресу находится

    ты неправильно бъявил не надо char *

    обьяви как DWORD



    например так , в результате будет вызвана ExitProcess
    Код (Text):
    1.  
    2.  
    3. void lame (char* buff)
    4. {
    5. printf("[+]\tEntering to lame() function\n");
    6. //Здесь выравнивание добавит 4 байта , так что
    7. // что 12 что 16  всё равно будет 16 -  зависит от
    8. //выравнивания
    9. char _small[12];
    10. strcpy(_small, buff);
    11. }
    12.  
    13.  
    14.  
    15.  
    16. main(int argc, char **argv)
    17. {
    18. printf("[+]\tEntering to Main() function\n");
    19. const struct {
    20.   char strprev[16];
    21.   DWORD d ;
    22.   char strafter[12];
    23.  }xploit =
    24. {
    25. {'a','b','c','d','e','f','g','h','i','j','k','l','n','m','o','p'},
    26. (DWORD)ExitProcess,
    27. {'1','2','3','4','5','6','7','8','9','0','1','2'}
    28. };
    29.  
    30.  
    31. lame ((char*)&xploit);
    32.  
    33. };
    34.  








    дык с помощью шестнадцатиричного редактора :derisive:

    открываешь kernel32.dll или user32.dll и ищеш, и не надо никакого softice



    p.s поищи call esp в кернел 32 (ff d4)

    у меня в xpsp2 есть такое

    так же есть ещё advapi.dll , shell32.dll и тд которые очень часто есть в программах