• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

CTF Writeup: "Классика" (codeby.games)

Don Reverso

One Level
05.07.2024
9
25
BIT
206
  • Название: Классика​

  • Категория: reverse​

  • Платформа: codeby.games

В архиве нас ждут 2 файла - classic.elf и classic.exe, под разные платформы. Запускаем любой и наблюдаем следующую картину:

1720186948413.png

Гугл даёт нам Симфонию номер 40, но пока непонятно, в каком виде этот ответ ввести, и правильный ли он вообще. Поэтому кидаем файл в IDA - может, статический анализ нас спасёт.

1720186991942.png
1720187002707.png


Так как этот таск - один из самых лёгких, то и условия у нас почти что лабораторные, словно автор вообще не подозревал, что этот файл будут ревёрсить. Сразу можно заметить fgets, принимающий наш ответ, а затем и strncmp, который сравнивает его с Str и в зависимости от результата нас кикает или пускает дальше. Если же перейти в память по Str, то увидим весьма тривиальную картину:

1720187055724.png


Слова излишни, комментировать нечего. Пробуем Symphony 40:

1720187073158.png


А дальше мы уже внезапно без всякой прелюдии должны ввести флаг. Глядя в код, можно понять, что тут уже будет поинтереснее:

1720187096910.png
1720188112446.png


Здесь уже, во-первых, программе зачем-то понадобилась длина Str - А значит, функция sub_4015EF, в которую та передаётся, может что-то преобразовывать. Если мы перейдём в память и поглядим на Str1, с которой сравнивается наш флаг, то наши догадки лишь подтвердятся:

1720187171675.png


Согласитесь, мало напоминает формат CODEBY{flag}. Значит, вышеупомянутая функция каким-то образом шифрует наш флаг в этот набор байт либо расшифровывает последний в наш флаг. Заглянем внутрь неё (переменные я переименовал для наглядности):

1720187195719.png


Здесь (да и вообще при анализе псевдокода) очень пригодились бы знания об арифметике указателей и памяти в С (16 строка). Грубо говоря, можно провести аналогию:

*(buf_pointer + offset) == buf_pointer[offset]

IDA часто любит так писать взаимодействия с массивами, к этому надо привыкнуть. Из кода можно понять, что каждый элемент того набора байт ксорится с соответствующим символом Str, причём ксор происходит циклично (строка 12), из-за чего разница в длинах не является помехой. А так как XOR - самообратимая операция, то всё, что нам нужно - взять этот массив и поксорить с Symphony 40 - и мы получим наш флаг!
Напишем вспомогательную программу на питуне:
1720187305797.png


Обратите внимание, в 4 строке под конец списка xor_key добавляется нулевой байт - для имитации Сишных строк (почитайте, как вообще устроены строки в С - интересная тема). Предложенный Идой алгоритм устроен так, что сначала идёт проверка индекса, потом сразу же инкремент, а затем и операция. Поэтому добавить его надо, без него вы расшифруете лишь половину флага))

Запускаем:

1720187408700.png


Флаг получен! Надеюсь, этот простенький райтап поможет вам в продвижении в нашем нелёгком деле.

Удачного ревёрса!

made 4 @rev_with_da_boys
 

Вложения

  • 1720187102167.png
    1720187102167.png
    6,5 КБ · Просмотры: 17
Последнее редактирование:

Cruel Lord

Green Team
29.08.2023
17
8
BIT
108
Так то райтап норм, но мне кажется что через брейкпоинт в нужном месте решается легче и быстрее
 
  • Нравится
Реакции: Don Reverso
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!