Здравствуйте, эксплуататоры.

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

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

Фаза анализа[angel_A]

Как обычно, мы всегда должны проверять файл, прежде чем что-то с ним делать. Я рекомендую всегда начинать с команды file. Я получил файл в виде файла zip, поэтому, чтобы разархивировать его, вы можете использовать команду unzip, и вы увидите два файла.

Как видите, в нашем терминале появились angel_A и angel_B.

Позвольте мне проверить, какие файлы нам показали.

Как вы видете:

angel_A: Исполняемый файл ELF 64-bit LSB pie, x86–64, версия 1 (SYSV), динамически связанный, интерпретатор /lib64/ld-linux-x86–64.so.2, BuildID[sha1]=90a71dbbf2c94dc164a49328fb82f8fa914a9701, для GNU/Linux 3.2.0, без разделов

angel_B: 64-битный исполняемый файл ELF LSB, x86–64, версия 1 (SYSV), статически связанный, Go BuildID=Xd_LgpWItJBNJmN63lQy/oWW_4FYae77KCrbbrcIX/2pmyS7gUszdXBsoOAYWo/PyEjnQ2VYI7PIdiOmGXg, не разделенный

Я собираюсь начать с файла angel_A:

Мы видим, что angel_A 64-битный, и он не разделён, и это здорово!

Он запрашивает имя пользователя, которого мы не знаем. Я пытался переполнить символом «А», но это не сработало.

Я использовал команду strings и увидел интересную ссылку, которая перенаправляет на видео на YouTube. Когда вы нажмете на нее, вы увидите этот результат :)

Кроличья нора! что нам это не нужно. Мы по-прежнему будем пробовать другие методы, чтобы увидеть, что мы можем сделать с этим файлом.

fgets более безопасен, чем gets. А это значит, что мы не в состоянии его переполнить!

Когда мы проверяем с помощью команды checksec, мы видим, что PIE включен, а также NX.

Если вы не знакомы с этим. Пожалуйста, вернитесь к моим предыдущим блогам, где я поделился некоторыми замечательными блогами и каналами, где вы можете учиться!

Мы видим системный вызов execve(), и это означает:

Это приводит к тому, что программа, которая в настоящее время выполняется вызывающим процессом, заменяется новой программой с заново инициализированным стеком, кучей и (инициализированными и неинициализированными) сегментами данных.

Если мы используем strace -c ./angel_A, мы можем увидеть, сколько системных вызовов вызвано. Если вы заинтересованы и хотите узнать больше о файлах ELF, вы можете проверить: https://man7.org/linux/man-pages/man2/syscall.2.html

https://linux-audit.com/elf-binaries-on-linux-understanding-and-analysis/

Мы пойдем дальше с нашей фазой расследования.

Когда вы наберете «информационные функции», вы увидите, сколько функций вызывается из двоичного файла.

Я собираюсь разобрать основную функцию, как обычно.

Если вы не знакомы, вы можете проверить главную страницу gdb. Теперь для этого упражнения я буду использовать программу Cutter.

Пожалуйста, обратите внимание, где я нарисовал. У нас есть argc и argv, нам нужно вспомнить, что это такое в программировании на C.

  • argc — количество аргументов в командной строке (включая само имя программы)
  • argv — это массив строк в стиле C (массивы символов, с нулевым символом в конце каждой строки).

Как видите, «var_4 ожидает ввода от пользователя. Чтобы лучше понять этот файл, я буду использовать Radare2.

Хм, интересно! Я вижу строку под названием U”kym~humr”, и у нас есть адрес с именем 0x561c1cf5b060.

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

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

Как я уже упоминал, мы должны понимать алгоритм дизассемблированного выше кода.

Каждый символ введенной строки сравнивается с каждым символом предопределенной строки, но перед сравнением над каждым символом выполняется операция XOR, после чего к символу добавляется 8.

Позвольте мне показать пример:

  1. k был дан нам как символ. Обычно он сравнивается с моим вводом, но мы уже знали, что странная строка уже используется. Таким образом, мы можем использовать таблицу ASCII, чтобы увидеть десятичное значение k.

Потрясающий. Теперь я попытаюсь перевернуть персонажа, чтобы прочитать его.

Чтобы изменить это, мы начнем от основания к вершине. Это должна быть обратная операция.

  1. k = 107, мы вычтем 8, а затем xor с 4

Хм, интересно! Чтобы прочитать имя пользователя, я собираюсь использовать простой скрипт на Python!

Потрясающий! Мы нашли имя пользователя, это был первый вопрос

Фаза анализа[angel_B]

Мы завершили первую часть! Следующая цель – ответить на второй вопрос.

Как видите, этот файл написан на языке GO. Позвольте мне также проверить этот файл.

Мы видим бесчисленное количество строк, которые нам не нужны. Нас больше интересуют системные вызовы, а также полезные строки, которые позволяют нам получить пароль.

Мы видим системные вызовы языка GO, но все равно не то, что нам нужно.

Я пытался найти основную функцию во время выполнения этого двоичного файла. Я думаю, что я буду использовать резак или радар2, чтобы увидеть больше.

Как видите, мы не можем увидеть основную функцию в этом бинарнике.

Мы вводим «A», чтобы увидеть, есть ли у него переполнение буфера или нет. И мы видим, что его нет!

Мы получаем вывод: "Вы недостойны рая"

Давайте снова рассмотрим открытие в резак, чтобы увидеть, что мы можем получить из этого результата.

Как вы можете видеть выше, если мы поместим неправильное значение, оно будет следовать за красной или зеленой линией.

Мы видим, что «runtime. memequal’ будет вызываться для контроля равенства указателей.

Мы можем получить информацию из этой документации: https://groups.google.com/g/golang-codereviews/c/toERNWvTLq8

Я собираюсь открыть это в R2:

0x004a54a1 48890424 mov qword [rsp], rax
0x004a54a5 488d055f5802. лиа ракс, [0x004cad0b] ; «GOg0esGrrr!IdeographicMedefaidrinNandinagariNew_Tai_LueOld_PersinOld_SogdianPau_Cin_HauSignWritingSoft_DottedWarang_CitiWhite_»
0x004a54ac 4889442408 mov qword [var_8h], rax
0x004a54b1 48894c2410 mov qword [var_10h], rcx

Отлично, мы получаем строку через R2. Вы также можете декомпилировать его через резак. Вы могли бы получить тот же результат.

Вы также можете проверить GDB:

Этот пароль должен быть следующим: GOg0esGrrr!

Теперь мы получили имя пользователя и пароль. Мы беспокоимся о флаге.

Краткое содержание

Часть 2 будет предоставлена ​​вам. Первая часть была просто обратной тренировкой/разогревом :)

Вторая часть будет посвящена эксплуатации бинарных файлов. Я очень рада снова видеть вас на этом канале!