DEP?

Тема в разделе "WASM.WIN32", создана пользователем ololoe, 7 ноя 2009.

  1. ololoe

    ololoe New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    17
    Написал программу, которая переполняет буфер в самой себе.

    Код (Text):
    1. #define OVERFLOW_LEN    72
    2. #define BUFFER_LEN  64
    3.  
    4. char overflow[] =
    5.     "\x68\x22\x12\x40\x00"  // push 00401222h - старый адрес main module (куда ret из main)
    6.     "\xc3"                  // retn
    7.     "\x90\x90"\
    8.     "\x90\x90\x90\x90\x90\x90\x90\x90"\
    9.     "\x90\x90\x90\x90\x90\x90\x90\x90"\
    10.     "\x90\x90\x90\x90\x90\x90\x90\x90"\
    11.     "\x90\x90\x90\x90\x90\x90\x90\x90"\
    12.     "\x90\x90\x90\x90\x90\x90\x90\x90"\
    13.     "\x90\x90\x90\x90\x90\x90\x90\x90"\
    14.     "\x90\x90\x90\x90\x90\x90\x90\x90"\
    15.     "\xc0\xff\x12\x00"
    16.     "\x34\xff\x12\x00";
    17.  
    18. int i;
    19.  
    20. int main(int argc, char* argv[])
    21. {
    22.  
    23.     char arr[BUFFER_LEN];
    24.     for(i=0; i < OVERFLOW_LEN; i++) {
    25.         arr[i]=overflow[i];
    26.     }
    27.     return 0;
    28. };
    Для тех,кто захочет сконпелить - адреса рассчитаны для lcc32.

    Если я правильно понял суть DEP, она должна вылетать, т.к. мы выполняем код из стека. Но она этого не делает. ЧЯДНТ?

    Кто уверен, что у него включен DEP - проверьте плиз у себя.
     
  2. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Вы какой DEP имеете ввиду программный или аппаратный. Да и по умолчанию деп включен только для критический файлов в системе типа Explorer.exe и.т.д. Если хотите увидеть включен деп или нет в вашей программе для начало проверьте с помощью процесс эксплорера а потом тестируйте.
     
  3. ololoe

    ololoe New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    17
    У меня вообще 2к, я на чужих машинах проверял. А как процесс эксплорером проверить?

    Может, кто-то у себя проверит?
     
  4. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    View-> Select Columns... -> DEP Status
    На 2к программный деп. А DEP работал и работает.
     
  5. ololoe

    ololoe New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    17
    Кто-то проверял, у кого-то прога вылетала?

    DEP только на х64 работает или мне показалось?
     
  6. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    >>Может, кто-то у себя проверит?

    Приведенный пример жизнеспособен только совсем в тепличных условиях. Надо ориентироваться хотя бы на наличие софтварного деп.

    >>DEP только на х64 работает или мне показалось?

    На 64 всегда включен аппаратный DEP для 64-битных приложений, для 32-битных в 64-битной ОС можно настраивать.
    На 32 тоже работает. Но это не проблема, по обходу hardware-enforced DEP была давно статья в Uninformed-е, посмотрите на http://uninformed.org/
     
  7. ololoe

    ololoe New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    17
    Так его кто-то на компе с гарантированно работающим DEP запускал? :) Оно валится или нет?

    Ты про это http://www.securitylab.ru/analytics/263899.php?

    А как обходить софтверный DEP?
     
  8. ololoe

    ololoe New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    17
    Так и не понял, что делает софтверный деп.
     
  9. ololoe

    ololoe New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    17
    У меня на 2к DEP status вообще серый, так что не думаю, что он у меня вообще есть.
     
  10. zet

    zet New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    Windows XP SP2 x64 Edition
    Unhandled exception at 0x0012ff34 in buffer-overflow03.exe: 0xC0000005: Access violation.
     
  11. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    2ololoe:
    А где в вашем примере, собственно, выполнение кода из стека? - в вашем коде есть переполнение буфера стека...
    Вот если бы вы переписали код функции в буфер arr, а затем выполнили бы эту функцию, например так:

    typedef void( *TpFunc)(void);
    TpFunc pFunc = (TpFunc)arr;
    pFunc();

    то это можно назвать выполнение кода функции на стеке!
     
  12. ololoe

    ololoe New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    17
    gorodon,
    "\x34\xff\x12\x00"; - это адрес начала массива в стеке, им перезаписывается старый eip.

    Насчет ptr кстати идея, можно это переписать так, чтобы адреса не были рассчитаны под конкретный конпелятор?
     
  13. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Насколько я понимаю, суть DEP - запретить выполнение кода на страницах памяти процесса, не имеющих флага PAGE_EXECUTE. При вкюченном DEP происходит генерация исключения.
    Если вы именно этот факт хотите зафиксировать, то надо написать простую програму выполнения кода функции на стеке - как я писал выше. Тогда при включенном DEP будет генерится исключение, при выключеном DEP - функция будет работать.

    Другой вопрос - если вы хотите отрабатывать прехват управления методом переполнения буфера...
    Где-то у Криса Касперски я видел статьи по этому поводу...там описано, кстати, как обойти DEP, вызвав VirtualProtect и изменив тем самым атрибуты страниц памяти.
    >Насчет ptr кстати идея, можно это переписать так, чтобы адреса не были рассчитаны под конкретный конпелятор?
    ? Для этого надо заранее знать значение указателя стека - ну, для тренирвки можно, конечно - перед заполнением буфера arr вычислить значение указателя стека и поместить его с нужным смещением в overflow...:)
     
  14. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    ololoe
    Программный DEP на мой взгляд просто добавляет при вызове системных функций проверку куда происходит возврат, и если возврат происходит на страницу для которой запрещено выполнение, то генерируется исключение. То есть код в стеке выполнять можно, но только пока не вызываем системных функций. Хотя вернуться в страницу для которой выполнение разрешено вполне можно.
     
  15. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    ololoe, Black_mirror
    Вот примерчик, демонстрирующий работу DEP - ограничение выполнения кода на стеке:
    Код (Text):
    1. void fSomeFunc(void)
    2. {
    3.     __asm{
    4.         push eax
    5.         mov eax,0x01020304L
    6.         pop eax
    7.     }
    8. }
    9.  
    10. const char buffunc[] = "\x50\xb8\x04\x03\x02\x01\x58\xc3";
    11.  
    12. #pragma optimize( "", off )
    13. int main(int argc, char* argv[])
    14. {
    15.     char arr[32];//,*ptr;
    16.     typedef void ( *TpFunc)(void);
    17.     TpFunc pFunc = (TpFunc)(void*)arr;
    18.     //
    19.     //Обычная функция
    20.     fSomeFunc();
    21.     //
    22.     //
    23.     for(int i=0;i<8;i++)
    24.     {
    25.         arr[i] = buffunc[i];
    26.     }
    27.     //Выполняем код функции на стеке
    28.     printf("Execute code on stack...");
    29.     pFunc();
    30.     printf("Ok!");
    31.     //
    32.     return 0;
    33. }
    34. #pragma optimize( "", on )
    Если скомпилить эту программку и запустить с выключенным DEP, то программа отработает...без гвоздей.
    Если программу запустить с включенным DEP, то появится сообщение типа этого:
    "To elp protect your computer, Windows has closed this program."