Лабораторная работа 1

Описание программы

В программе реализована процедура аутентификации по логину и паролю.

Сначала запрашивается логин в виде строки. Полученая строка переворачивается с помощью функции std::string invert_login(std::string admin) и сравнивается с требуемым перевернутым логином "nimda"

Далее запрашивается строка с паролем и со строкой делаются следующие преобразования.

  1. Двоичное представление каждого символа строки сдвигается побитово влево на 4
  2. Результат предыдущей операции переводится в 16-ричное представление
  3. Далее с результатом предыдущей операции производится сложение с логином по модулю 2 , и полученная строка сравнивается с требуемым паролем

Меры защиты

  1. Опирация побитового сдвига влево на 4 - разбита на 4 операции:

            - двиг влево на 2 , сдвиг влево на 2, сдвиг влево 2, сдвиг вправо на 2.
    
  2. Вместо прямого указания в программе количество побитовых сдвигов - вызывалась функция c различным параметрами cifre , которая независимо от параметров всегда возвращает 2.

  3. Добавлены бесполезные условные переходы, если число символа будет отрицательным.

  4. Добавлены бесполезные условия Switch case.

  5. Ряд констант и программных выражений были заменены на безсмыленные фразы с помощью директивы #define

  6. Реализован метод детектирования отладки программы с помощью методов из библиотеки chrono , если программа выполняется больше 30 секунд нужно завершать программу с ошибкой.

  7. При сборке файла были использованы флаги: -s для удаления таблицы .symtab, -O3 (оптимизация и ухудшение читабельности);

  8. бинарный был упакован с помощью upx

Инструкция по сборке

  1. mkdir build && cd build

  2. cmake ..

Описания функций

  1. std::string offset(const std::string &s) - принимает строку и сдвигает каждый символ в двоичном представлении побитово на 4 влево и возвращает новую строку.

  2. std::string string_to_hex(const std::string &input) - переводит строку символов в строку из шестнадцатиричных кодов.

  3. std::bitset<32> to_bitset(std::string s) - переводит строку в объект из двоичных чисел.

  4. std::string to_string(std::bitset<32> bs) - переводит из типа bitset в строку.

  5. std::string xoring(std::string str1, std::string str2) - прозводит операцию сложения по модулю 2.

  6. std::string crypto(std::string password, std::string login) - функций в которой последоветельно вызываются функции ofset, string_to_hex, xoring и возвращается результат в виде строки.

  7. std::string invert_login(std::string admin) - переворачивает строку.

Примеры работы программы

Если вводить правильные данные: login: admin

password: 1y8rOStw0RZV29qfqVpp

image

Если вводить неправильные данные, то выводится сообщение об ошибке и предложение ввести пароль еще раз:

image