CTF reverse engineering Обучение реверс Форензика

Cамое сложное задание категории Reverse c Google CTFl 2020. Форензика

Cамое сложное задание категории Reverse c Google CTFl 2020. Форензика

С этим заданием справилось совсем не много народу: из всех участников финишировало всего 36 команд и судя по количеству решений, данная задача оказалась самой сложной в категории Reverse.

Давайте разберёмся в чём подвох?

Скачиваем файл по задания и распаковываем его.

Получаем некоторый образ диска, а также файл для запуска через qemu.

Сразу же примонтируем диск и посмотрим на его содержимое.

Как можно заметить перед нами файловая система Linux дистрибутива.

В задаче говорится и намекается на уникальность пользователя root. Давайте взглянем на его пароль.

Попробуем найти пароль через брут хэша.

Находим, что пароль это строка “no”. Попробуем авторизоваться с ней запустив систему.

Почему-то авторизация не проходит, хотя пароль верный. Это может означать, что процесс авторизации как-то изменён. Первое, что бросается в глаза это сообщение “Wrong user or password”, которое не встречается при авторизации в других дистрибутивах, и кажется добавлено авторами задания.

Попробуем найти это строку в каком либо файле на системе.

Встречается данная строка только в некоторой библиотеке pam_chck.so. Посмотрим на обращения к этой библиотеке.

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

Откроем эту библиотеку в IDA PRO.

Явно видим проверку на имя пользователя “root”, а также сообщение которое мы видели на экране авторизации.

Функция check_device производит обращение к некоторому устройству.

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

Отлично, взглянем на него в IDA PRO.

Данный модуль выполняет ACPI запрос и использует некоторый метод CHCK. Подробнее про ACPI устройства можно узнать тут – https://ru.wikipedia.org/wiki/ACPI

Нам нужно найти модуль, который реализует используемое устройство ACPI. Это можно сделать несколькими способами, один из самых простых это получить их из уже работающей системы. Второй способ это распаковка initramfs-linux из папки /boot/. В частности если отсортировать все файлы по времени изменения, то можно выйти на папку boot и файл initramfs-linux.

Распаковав initramfs-linux можно получить некоторый ACPI модуль.

Однако он находится в скомпилированном виде. Представим его в виде более-менее читаемого кода.

Теперь мы можем его анализировать.

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

Нас интересует метод CHCK.

Судя по его структуре он формирует массив такого же размера как и инициализированный выше и проверяет его. Вероятно, формируемый массив зависит от нашего ввода.

Как можно заметить, перед проверками идёт вызов функции WDTA(). Наименование может расшифровываться как Wait Data. После этого происходят некоторые проверки по результатам которых в выходной массив помещается значение. Приходящие данные могут являться нажатиями клавиатуры. А значения с которыми проверяется код могут представлять собой scan-коды различным системных клавиш на клавиатуре.

https://wiki.osdev.org/PS/2_Keyboard

Согласно таблице по ссылке выше можем понять, что нажатие правого Shift это код 0x2a, соответственно при его нажатие в выходной массив будет записан байт 0x2a, который соотв. первому байту.

Если пройти первые 3 байта, то станет понятно, что это нажатия на клавиши “C”, “T”, “F”, то есть ввод флага.

Переводим все коды в символы и получаем флаг.

CTF{acpi_machine_language}

Интересное заданице и самое забавное, что почти ничего не надо было реверсить, эту задачу стоило бы отнести в категорию “Forensics”.

Очень злой админ
Очень злой админ Автор статьи

Админ сайта. Публикует интересные статьи с других ресурсов, либо их переводы. Если есть настроение, бывает, что пишет и что-то своё.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *