В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте netology.ru.
Важно: выполняйте данную задачу на ОС Linux (Ubuntu или Kali)
У вас есть следующий код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
/* выделяем буфер из 255 символов + \0 для хранения команды */
char command[256] = {'p', 'i', 'n', 'g', ' ', '\0'};
/* буфер для хранения хоста, который нужно пропинговать */
char host[16];
printf("please enter host for ping\n");
/* получаем от пользователя имя хоста - нужно ввести в консоли, например, ya.ru и нажать Enter */
gets(host);
/* отладочный вывод - печатаем команду */
printf("command: %s\n", command);
/* отладочный вывод - печатаем хост */
printf("host: %s\n", host);
/* добавляем к команде хост, при этом \0 в команде заменяется на первый символ из host */
strcat(command, host);
/* отладочный вывод - печатаем полную команду */
printf("full command: %s\n", command);
/* выполняем команду */
system(command);
return 0;
}
Важно: строки, которые начинаются с /*
и заканчиваются */
- это комментарии (пояснения к коду программы), вы можете их не печатать.
По аналогии с лекцией установите необходимые зависимости (apt update && apt install gcc
) и скомпилируйте данную программу (cc main.c -o main
) - не обращайте внимание на предупреждения, если они будут.
Далее:
1. Запустите её (./main
), вы увидите приглашение вида:
2. Введите адрес хоста, который необходимо пропинговать и убедитесь, что пинг работает:
3. Завершите работу приложения с помощью сочетания клавиш Ctrl + C
Творческая часть: попробуйте подобрать данные (по аналогии с лекцией) так, чтобы:
- Приложение "упало" (вы получили сообщение segmentation fault или другое, свидетельствующее об ошибке)
- Вам удалось выполнить вместо
ping
другую команду
Подсказка
Начните вводить по одному символу, пока не увидите, что команда ping
вдруг заменилась на нужную вам (см. вывод printf("full command: %s\n", command);
).
В качестве результата пришлите ответы на следующие вопросы:
- Какое предупреждение (
Warning
) было выведено при компиляции? По желанию: проведите доп.исследование на предмет сути предупреждения (с чем оно связано, какие риски от использования одной из функций в программе и что это за функция). - Ввод, приводящий к падению приложения
- Ввод, приводящий к выполнению другой команды (не
ping
) с помощью переполнения
В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте netology.ru.
Важно: выполняйте данную задачу на ОС Linux (Ubuntu или Kali)
Программисты прислали вам якобы "исправленный" вариант программы ping
:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
/* выделяем буфер из 24 символов для хранения команды */
char command[24] = "ping ";
/* буфер для хранения хоста, который нужно пропинговать */
char host[16];
printf("please enter host for ping\n");
/* получаем от пользователя имя хоста */
/* нужно ввести в консоли, например, ya.ru и нажать Enter */
fgets(host, sizeof(host), stdin);
/* отладочный вывод - печатаем команду */
printf("command: %s\n", command);
/* отладочный вывод - печатаем хост */
printf("host: %s\n", host);
/* добавляем к команде хост, при этом \0 в команде заменяется на первый символ из host */
strcat(command, host);
/* отладочный вывод - печатаем полную команду */
printf("full command: %s\n", command);
/* выполняем команду */
system(command);
return 0;
}
Проведите повторный анализ и посмотрите:
- Можно ли реализовать переполнение?
- Можно ли выполнить произвольную команду (если да, то как)?
- Если ответ на п.2 - да, то можно ли получить shell (т.е. запустить
sh
иbash
и продолжить работу с интерпретатором команд в интерактивном режиме)?
В качестве результата пришлите ответы на вопросы, указанные в задании (раздел Задача).
В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте netology.ru.