Что такое переполнение буфера и как я вызываю тот?

Это можно сделать через DBUS, например:

for service in `qdbus | grep org.kde.konsole-`; do 
    for session in `qdbus $service | grep ^/Sessions/`; do
        qdbus $service $session org.kde.konsole.Session.runCommand "cd"
    done
done

. Он найдет все «службы» (процессы Konsole), затем найдет все сессии для каждой службы и отправит команду / символы «cd». «на все эти сессии.

Если вы хотите отправить только определенному процессу консоли, вам нужно заменить первый цикл for.

Также следует отметить, что это будет работать, даже когда сеанс запускает ssh на удаленном сервере. Все, что делает метод runCommand () - отправляет символы в сеанс. Но это также означает, что сеанс должен иметь приглашение оболочки, готовое принять команду, а не в середине выполнения какой-либо другой команды.

30
задан jww 12 September 2014 в 13:26
поделиться

9 ответов

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

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

С точки зрения того, как Вы могли программировать тот сами, это будет простой вопрос:

char a[4];
strcpy(a,"a string longer than 4 characters"); // write past end of buffer (buffer overflow)
printf("%s\n",a[6]); // read past end of buffer (also not a good idea)

, Компилирует ли это и что происходит, когда это работает, вероятно, зависел бы от Вашей операционной системы и компилятора.

27
ответ дан Basic 27 November 2019 в 23:11
поделиться

Классический пример переполнения буфера:

// noone will ever have the time to type more than 64 characters...
char buf[64];
gets(buf); // let user put his name

одного только переполнения буфера чаще всего не происходит намеренно. Это чаще всего происходит из-за так называемой "off-one" ошибки. Значение Вас неверно рассчитало размер массива одним - возможно, потому что Вы забыли объяснять завершающийся нулевой символ, или потому что некоторый другой материал.

, Но это может также использоваться для некоторого злого материала. Действительно, пользователь давно знал об этой дыре и затем вставляет, говорят, что 70 символов, с последними, содержащими некоторые специальные байты, которые перезаписывают некоторый слот стека - если пользователь действительно хитер, он поразит слот обратного адреса в стеке и перезаписывает его так, это переходит вперед в тот просто вставленный буфер: Поскольку, что вводимый пользователь не был своим именем, но своим кодом оболочки, который он ранее скомпилировал и разгрузил. Тот будет затем просто выполненный. Существуют некоторые проблемы. Например, необходимо расположить не иметь "\n" в том двоичном коде (потому что добирается, прекратил бы читать там). Для других путей, которые смешивают с опасными строковыми функциями, двоичный нуль проблематичен, потому что строковые функции прекращают копировать там в буфер. Люди использовали xor с два раза тем же значением для создания нуля также, не пишущий нулевой байт явно.

Это - классический способ сделать его. Но существуют некоторые блоки безопасности, которые могут сказать, что такие вещи произошли и другой материал, которые делают неисполняемый файл стека. Но я предполагаю, что существует путь лучшие приемы, чем я просто объяснил. Некоторый ассемблерный парень мог, вероятно, теперь рассказать Вам долго истории о том, что :)

, Как избегать его

Всегда функции использования, которые берут максимальный аргумент длины также, если Вы не 100% уверены, что буфер является достаточно действительно большим. Не играйте в такие игры как, "о, число не превысит 5 символов" - оно перестанет работать однажды. Помните, что одна ракета, где ученые сказали, что число не превысит некоторую величину, потому что ракета никогда не была бы этим быстро. Но однажды, это было на самом деле быстрее, и что закончилось, было целочисленное переполнение и разрушенная ракета (это об ошибке в Ariane 5, одна из самых дорогих Компьютерных ошибок в истории).

, Например, вместо получает использование fgets. И вместо sprintf использование snprintf, где подходящий и доступный (или просто C++ разрабатывают вещи как istream и материал)

32
ответ дан Johannes Schaub - litb 27 November 2019 в 23:11
поделиться

Переполнение буфера просто пишет мимо конца буфера:

int main(int argc, const char* argv[])
{
    char buf[10];
    memset(buf, 0, 11);
    return 0;
}
10
ответ дан Tim Lesher 27 November 2019 в 23:11
поделиться

В дополнение к тому, что было уже сказано, имейте в виду, что you'r программа может или не может "отказать", когда переполнение буфера происходит. Это должно катастрофический отказ, и необходимо надеяться, что это делает - но если переполнение буфера "переполняется" в другой адрес, который приложение также выделило - приложение, может казаться, работает обычно в течение более длительного промежутка времени.

, Если бы Вы используете более поздний выпуск Microsoft Visual Studio - я предложил бы использовать новые безопасные дубликаты в stdlib, такие как sprintf_s insted sprintf, ect...

5
ответ дан NTDLS 27 November 2019 в 23:11
поделиться

Этого должно быть достаточно для репродуцирования его:

void buffer_overflow() 
{
    char * foo = "foo";
    char buffer[10];

    for(int it = 0; it < 1000; it++) {
        buffer[it] = '*';
    }

    char accessViolation = foo[0];
}
1
ответ дан alex2k8 27 November 2019 в 23:11
поделиться

"Классический" пример переполнения буфера:

int main(int argc, char *argv[])
{
    char buffer[10];
    strcpy(buffer, argv[1]);
}

, Который позволяет Вам играть с параметрами переполнения буфера и настроить их к своему содержанию основ. Книга" Взламывание - Искусство Эксплуатации " (Ссылка переходит к Amazon) вдается в большие подробности о том, как играть вокруг с переполнением буфера (просто как интеллектуальное осуществление, очевидно).

1
ответ дан ReinstateMonica Larry Osterman 27 November 2019 в 23:11
поделиться

Если Вы хотите проверить, что Вы программируете для переполнения буфера, Вы могли бы выполнить его с инструментами как Valgrind. Они найдут некоторые ошибки управления памятью для Вас.

1
ответ дан John Smith 27 November 2019 в 23:11
поделиться

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

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

0
ответ дан dmckee 27 November 2019 в 23:11
поделиться

С корректными данными ответами: Для получения больше в эту тему Вы могли бы хотеть слушать безопасность Подкаста Теперь. В Эпизод 39 (некоторое время назад) они обсудили это подробно. Это - быстрый способ получить более глубокое понимание, не требуя для переваривания целой книги.

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

0
ответ дан Olaf Kock 27 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: