#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 отключена для всех процессов
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
Если уж очень надо вызвать исключительную ситуацию, попробуй вместо объявления массива в стеке выделить память в куче (напр. 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)
// Есть проблемы с кучей. Если приложение скомпилировано для отладки, отладчик покажет, какие проблемы.
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)
// Есть проблемы с кучей. Если приложение скомпилировано для отладки, отладчик покажет, какие проблемы.
Цитата: cheburator
(по-моему, стандартное значение - 64 Кб).
Нет, стандартное - 4Кб.
Точно. Путаю с allocation granularity.