Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по переполнению

16K
07 октября 2007 года
4nob1oz
34 / / 14.06.2007
Вот код:
Код:
#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char buff[10];

    strcpy(buff,argv[1]);

    printf("%s",buff);

    return 0;
}


Даю программе в аргументе больше 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

 
Код:
Значение свойства DataExecutionPrevention_SupportPolicy Уровень политики Описание
2   OptIn (конфигурация по умолчанию)    Функция DEP включена только для системных компонентов и служб Windows
3   OptOut  Функция DEP включена для всех процессов. Администратор может вручную создать список приложений, для которых функция DEP отключена
1   AlwaysOn    Функция DEP включена для всех процессов
0   AlwaysOff   Функция DEP отключена для всех процессов


Ставил wmic OS Get DataExecutionPrevention_SupportPolicy -> 0, тоже нет переполнения. Изменил в boot.ini параметр /NoExecute=OptIn на /NoExecute=AlwaysOff и тоже нет переполнения.

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

На компе стоит WinXP Pro SP2
350
08 октября 2007 года
cheburator
589 / / 01.06.2006
А никто не гарантирует, что переполнение-то возникнет. Оно может возникнуть. Скажу точнее: если под переполнением понимать конкретно переполнение переменной buff, то оно конечно возникает, но отследить этого никто и ничто не может (в данном случае). Просто, видимо, непосредственно после этой переменной располагаются какие-то еще данные, явно или неявно принадлежащие выполняемой программе. Наверняка переполнение будет обнаружено системой, если попытаешься всунуть в буфер данные размером больше страницы (по-моему, стандартное значение - 64 Кб).
Если уж очень надо вызвать исключительную ситуацию, попробуй вместо объявления массива в стеке выделить память в куче (напр. char *buff = new char[10]), выполнить запись туда больше 10 байт, а затем спросить функцию HeapValidate, есть ли проблемы с кучей.
Пример:
 
Код:
char *buf = new char [10];
int *buf2 = new int [50]; // Выделим еще что-нибудь в куче, тогда наверняка данные свыше 10 байт, которые мы пытаемся писать в buf, "налезут" на buf2
strcpy (buf, "Well, guys, that's some very large string, and we'll try to write it into the 10-bytes long buffer, in order to detect memory access violation or any other problem to heap");
if (HeapValidate (GetProcessHeap(), 0, NULL) == 0)
  // Есть проблемы с кучей. Если приложение скомпилировано для отладки, отладчик покажет, какие проблемы.
255
08 октября 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: cheburator
(по-моему, стандартное значение - 64 Кб).


Нет, стандартное - 4Кб.

350
09 октября 2007 года
cheburator
589 / / 01.06.2006
Точно. Путаю с allocation granularity.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог