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

Рассматриваемые темы

  • Напишите код простого перебора на ассемблере на x32 dbg
  • Права доступа к памяти на x32 dbg

Описания

  1. Найдите место для хранения печатных символов в сегменте .data.
  2. Найдите место для хранения количества индексов в сегменте .data.

Для того, чтобы найти правильный сегмент для вставки значения, перейдите в раздел карты памяти и найдите сегмент данных с Защитой «RW».

Права на запись в память позволяют перезаписывать код, к которому может получить доступ инструкция кода. В противном случае в процессе отладки будет EXCEPTION_ACCESS_VIOLATION.

В этой статье я просто буду хранить все эти объявленные пользователем значения по адресу дампа памяти с защитой Writeable, который в данном случае является сегментом .data. Есть способ изменить права памяти в карте памяти по Right-click the highlighted address > Set Page Memory Rights > Select All > FULL ACCESS > Set Rights.

Проверьте дамп сегмента .data и определите место для хранения количества индексов и печатных символов. Затем перейдите к memory dump section и Right click > Binary > Edit.

После этого запомните адреса, которые использовались в качестве индекса, и строки.

я. Адрес для подсчета индексов = 0x00103020
ii. Адрес для строкового массива = 0x00103030

Давайте посмотрим на код, чтобы понять, как он работает.

По адресу 0x00101060 пользовательский ввод будет передаваться в регистр bl для дальнейшей обработки и проверки правильности ввода. Jp (четность перехода) выполнит проверку правильности пароля. Инструкция cmp по адресу 0x001010AE повлияет на вывод двоичного файла, поскольку cmovne (условное перемещение не равно) работает только в том случае, если выполнение инструкции по адресу 0x001010AE делает zf=0.

Теперь пришло время написать скрипт грубой силы в ассемблерном коде.
Необходимо будет выполнить две части кода:
1. Модификация инструкции перехода на конкретный адрес.
2. Новый раздел кода для итерации строк.

Проверьте раздел комментариев с правой стороны изображения для описания кода.

Он начинается с присвоения 0 адресу счетчика индексов (0x00103020). Все назначения инструкции jp меняются на начальный адрес раздела итерации строки (0x001010D6), так как, когда значение становится неправильным, он переходит к следующему символу в массиве строк и снова проверяется.

Что касается кодирования итераций строк, я прокомментировал написанный код, который кратко объясняет, как это работает на языке более высокого уровня.

Поместите точку останова по адресу 0x001010A7 и нажмите F9, чтобы она продолжала работать, пока не достигнет точки останова. Проверьте дамп памяти регистра ESI, чтобы получить флаг.

использованная литература

https://github.com/WargamesMY/2018
https://x64dbg.com/blog/