Skip to content

Latest commit

 

History

History

10_c

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

Домашнее задание к занятию «Язык С и программные уязвимости»

В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте netology.ru.

Задание 1

Важно: выполняйте данную задачу на ОС 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

Творческая часть: попробуйте подобрать данные (по аналогии с лекцией) так, чтобы:

  1. Приложение "упало" (вы получили сообщение segmentation fault или другое, свидетельствующее об ошибке)
  2. Вам удалось выполнить вместо ping другую команду
Подсказка

Начните вводить по одному символу, пока не увидите, что команда ping вдруг заменилась на нужную вам (см. вывод printf("full command: %s\n", command);).

Результаты

В качестве результата пришлите ответы на следующие вопросы:

  1. Какое предупреждение (Warning) было выведено при компиляции? По желанию: проведите доп.исследование на предмет сути предупреждения (с чем оно связано, какие риски от использования одной из функций в программе и что это за функция).
  2. Ввод, приводящий к падению приложения
  3. Ввод, приводящий к выполнению другой команды (не ping) с помощью переполнения

В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте netology.ru.

Задание 2

Важно: выполняйте данную задачу на ОС 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;
}

Задача

Проведите повторный анализ и посмотрите:

  1. Можно ли реализовать переполнение?
  2. Можно ли выполнить произвольную команду (если да, то как)?
  3. Если ответ на п.2 - да, то можно ли получить shell (т.е. запустить sh и bash и продолжить работу с интерпретатором команд в интерактивном режиме)?

Результаты

В качестве результата пришлите ответы на вопросы, указанные в задании (раздел Задача).

В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте netology.ru.