Проблема переполнения буфера - PullRequest
0 голосов
/ 01 декабря 2010

Я пытаюсь запустить пример переполнения буфера для запуска некоторого кода, но проблема в том, что когда я пытаюсь запустить код только для того, чтобы получить переполнение буфера, Windows выдает сообщение о том, что «Программа перестала работать, Windows проверка решения для программы. Поэтому, когда я пытаюсь убедиться, что он просто переполнен на один байт. Программа просто запускается, но не приостанавливает командное окно, чтобы я мог видеть адрес ошибки ошибки сегментации. Насколько я понимаю, мне нужно было бы изменить его и заставить запускать желаемое окно в качестве переданного параметра. Вот простая программа.

#define BUF_LEN 5

int main(int argc, char **argv)
{

char buf[BUF_LEN];

if (argc > 1)
{
 strcpy(buf, argv[1]);
}
 return 0;
 printf(buf);
 system("pause");
}

Ответы [ 4 ]

2 голосов
/ 01 декабря 2010

Ошибки сегментации являются лишь одним из проявлений неопределенного поведения. На самом деле нет ничего, что гарантировало бы вам, что ОС предоставит вам любую информацию о том, что здесь пошло не так.

В любом случае вам не нужен адрес для диагностики сегфоута. Здесь есть только одна вещь, которая может вызвать переполнение буфера, и вы точно знаете, что это: вызов strcpy ().

Предполагая, что вы должны использовать C, вместо этого нужно использовать strncpy ().

1 голос
/ 01 декабря 2010

Проблема заключается в том, что поведение переполнения буфера не стандартизировано - ваш пример может ссылаться на более старую версию Windows, которая все еще печатает адрес ошибки, или на совершенно другую операционную систему.

ДополнительноНе все переполнения буфера приводят к сбою программы - это зависит от того, какие данные записаны и куда.При небольших переполнениях буфера вы можете перезаписывать только некоторые другие локальные переменные или пространство заполнения, а не что-либо существенное для выполнения программы (например, адрес возврата функции).

0 голосов
/ 28 декабря 2011

При компиляции используйте «gcc -fno-stack-protector -o out filename.c», потому что gcc содержит встроенный протектор стека, и вам нужно его удалить.-fno-stack-protector удалит функцию защиты из gcc

0 голосов
/ 01 декабря 2010
#define BUF_LEN 5

int main(int argc, char **argv)
{

char buf[BUF_LEN];

if (argc > 1)
{
 strcpy(buf, argv[1]);
}

 printf(buf);
 system("pause");
 return 0;
}

return 0; идет в конце.В противном случае выполнение программы на этом останавливается.

...