В данной статье узнаем как перехватить данные, передаваемые между библиотечной функцией и программой, вспомним про файловые дескрипторы и решим 6-е и 9-е задания c сайта pwnable.kr.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Решение задания random
Нажимаем на иконку с подписью random, и нам говорят, что нужно подключиться по SSH с паролем guest.
При подключении мы видим соотвтствующий баннер.
Давайте узнаем какие файлы есть на сервере, а также какие мы имеем права.
ls -l
Таким образом мы можем можем прочитать исходный код программы, так как есть право читать для всех, и выполнить с правами владельца программу fd (установлен sticky-бит). Давай просмотрим исход код.
Программа генерирует случайное число, применяет операцию XOR (исключающее ИЛИ), и если результат операции XOR равен эталонному значению, выводит флаг.
Дело в том, что в данной программе используется функция rand(). Данная функция генерирует псевдослучайное число, преобразуя “зерно”, сгенерированное функцией srand(). Функция srand(number) должна вызываться каждый раз перед вызовом rand(). Если такого не происходит, то по умолчанию перед rand() срабатывает srand(1).
Таким образом, в данной программе генератор псевдослучайного числа каждый раз преобразует по одному и тому же алгоритму одно и то же “зерно”. Нам нужно узнать число, которое возвращает функция rand(), и проксорить с эталонным значением. Так как операция XOR обратима, то подавая на вход программе полученной значение, мы получим флаг.
Давайте перехватим данные между библиотечной функцией rand() и нашей программой. Для этого используем утилиту ltrace.
ltrace ./random
Мы видим с какими параметрами вызывается функция rand() и какое значение она возвращает. Теперь проксорим это значение с эталонным.
Подадим полученное число на вход нашей программе.
Сдаем флаг и получаем одно очко за такое легкое задание.
Решение задания mistake
Нажимаем на иконку с подписью mistake, и нам говорят, что нужно подключиться по SSH с паролем guest.
При подключении мы видим соотвтствующий баннер.
Давайте узнаем какие файлы есть на сервере, а также какие мы имеем права.
ls -l
Таким образом мы можем можем прочитать исходный код программы, так как есть право читать для всех, и выполнить с правами владельца программу fd (установлен sticky-бит). Давай просмотрим исход код.
В самом начале программы открывается файл и создается дескриптор. Про файловые дескрипторы я уже подробно писал в ЭТОЙ статье. Но дело в том, что в условии допущена ошибка. Таким образом сначала выполнится сравнение, результатом которого будет ложь, а потом уже присвоение этого ложного результата (т.е. 0) переменной fd.
Далее вызывается функция sleep и без предложения ввода в переменную pw_buf читаются данные. Но из-за ошибки в условии, они читаются не из открытого файла с паролем, а из стандартного ввода (дескриптор 0).
Далее мы вводим 10 символов, которые посимвольно ксорятся с 1 и сравниваются с паролем.
Таким образом, мы вводим две строки, символы которых результатом XOR операции должны дать 1. Найдем два символа, если проксорить которые, получим 1.
Это символы A и @. Теперь введем в программу две строки, одна из 10 символов ‘A’, а другая — ‘@’.
Сдаем флаг и получаем еще одно очко.
До встречи в следующих статьях!
Автор: RalfHacker