ошибка сегмента, отображаемая даже после выполнения программы - PullRequest
0 голосов
/ 31 мая 2018

Я только что написал простую программу для buffer overflow inspection.


This is simple code for buffer overflow

После запуска этого

Результат показывает:

 gcc -g buffer.c
 ./a.out Hello
----ACCESS GRANTED----

(это было ожидаемо)

 ./a.out aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
----ACCESS GRANTED----

(с указанием переполнения)

  ./a.out aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
----ACCESS GRANTED----
<b>Segmentation fault</b>

Интересно, зачем говорить ошибку сегментации после показарезультат.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Ваш вопрос, по-видимому, предполагает, что segfault происходит после завершения программы.Это на самом деле происходит во время выполнения, скорее всего, при выполнении неявного оператора return в конце основной функции.

При запуске программы на C система выполняет небольшую инициализацию перед вызовом основной функции (обычно этофактическая точка входа - функция _start() и _start() вызовы main()).Внутренне, вызов функции main() сохраняет адрес возврата (адрес, к которому можно вернуться после завершения функции).Очевидно, это зависит от процессора и компилятора, но адрес возврата часто сохраняется в стеке рядом с массивом p.При переполнении буфера на p вы можете перезаписать адрес возврата, поэтому при попытке возврата main() все идет не так.Скорее всего, программа перейдет по адресу, который не существует или не является исполняемым.

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

0 голосов
/ 31 мая 2018

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

Например,

checkpass(char *password)
{
    return !strcmp(password, "Hello");
}

(это предполагает, чтоpassword - строка с нулевым символом в конце)

...