Цель:
Получить флаг из двоичного (ELF) файла.

Рассматриваемые темы:
1. Radare2, x32/x64 dbg
2. Команда Linux (objdump, awk, cut и grep)
3. Скрипты Python

Процедура:
Вот идеи, как решить эту проблему :D. Давайте проведем статический анализ бинарного файла с помощью radare2 на компьютере с Linux (мой любимый инструмент отладки).

После просмотра ассемблерных кодов бинарник выглядит так, будто получает файл в качестве параметра и читает его. У него есть функция check и функция goodboy, которая выглядит подозрительно и требует дальнейшего изучения.

Фрагмент кода слева — это функция check. Было совершенно очевидно, что значение регистра eax будет сравниваться со значением в [local_8h], также известном как ebp-0x08h, для продолжения процесса. Затем попробуйте посмотреть вверх, чтобы понять, откуда берутся значения eax и [local_8h]. Существует операция xor над al (младшими байтами eax) с постоянным значением. Если сравниваемое значение не совпадает, оно переходит к функции badboy, в которой программа завершается :(

Итак, нам просто нужно получить значение eax, равное сравниваемому значению, чтобы код не запускал функцию badboy. Поскольку операция xor обратима, мы можем получить правильное значение eax с помощью константы с помощью [local_8h] (например, 0xf7 ^ 0xa3). Однако существует слишком много блоков кода, которые be xor. Таким образом, это невозможно сделать вручную, поэтому для облегчения нашей жизни необходим скрипт. Но прежде чем писать скрипт, нам нужно извлечь и отфильтровать весь ненужный опкод. Objdump поможет нам в этом.

objdump -d -M intel ch30.bin

Хм. Результаты очень длинные, и нам нужно отфильтровать их. Здесь я буду использовать команду манипулятора строк Linux: awk, cut и grep. Я оставлю используемую команду здесь и не буду подробно объяснять ее. Команда здесь была смешана с командой в доступной записи (доступ возможен только после решения проблемы opss…, поэтому некоторые команды awk и cut отредактированы с помощью ' символ х).

objdump -d -M intel xxx | awk -F'xx' -v RS="xxxx" 'xxxxxxxxxx' | cut -fx | grep "some mov and xor"

Вот важный код операции, необходимый для решения этой задачи. Чтобы получить шестнадцатеричный код внутри этого большого фрагмента кода операции, я написал скрипт на Python для автоматизации всего процесса. Вот фрагмент кода.

По сути, идея состоит в том, чтобы использовать регулярное выражение и условную операцию, чтобы отфильтровать все ненужные строки, а затем выполнить операцию xor для получения флага. Но почему-то есть какое-то значение, которое вообще не попало в xor. Таким образом, вы должны понять это сами, чтобы справиться с такой ситуацией :D

После того, как все было сделано правильно, появились строки в кодировке base64. После декодирования строк появляется EXE-файл (его можно распознать по MZ в заголовке вывода, вы можете немного изучить сигнатуру файла). Вау! Файл в файле. Затем давайте продолжим на машине с Windows (вы можете продолжить с Rarare2 или IDA pro на своей машине с Linux).

Из фрагмента кода видно, что общая функция файла EXE такая же, как у предыдущего файла ELF. Таким образом, то же самое решение может быть применено для решения проблемы (вам просто нужно внести небольшие изменения в строку grep и код, используемый для получения EXE).

Ну наконец то! Флаг выходит, как я и ожидал.

На этом все. Надеюсь, вам, ребята, понравилась моя первая статья о задаче реверс-инжиниринга. Ваше здоровье! Я также надеюсь, что смогу продолжить публиковать некоторые записи для интересных задач в будущем.

Купить мне пиццу 🍕?